Pagini recente » Cod sursa (job #1800891) | Borderou de evaluare (job #1569583) | Borderou de evaluare (job #2085669) | Borderou de evaluare (job #1906904) | Cod sursa (job #2165185)
#include <fstream>
#include <vector>
#define DIM 1000002
using namespace std;
ifstream in ("pinex.in");
ofstream out("pinex.out");
int n, ciur[DIM + 2];
long long a, b, B;
vector<int> prim, diviz;
bool test(int i, int j){
return i & (1<<j);
}
int main(int argc, const char * argv[]) {
in>>n;
for(int i = 2; i * i <= DIM; ++ i){
if(!ciur[i]){
prim.push_back(i);
for(int j = i + i; j <= DIM; j += i)
ciur[j] = 1;
}
}
while(n--){
in>>a>>b;
diviz.clear();
B = b;
long long sol = 0;
for(int i = 0; i < prim.size() && prim[i] * prim[i] <= b && B > 1; ++ i){
if(B % prim[i] == 0){
diviz.push_back(prim[i]);
while(B % prim[i] == 0)
B /= prim[i];
}
}
if(B > 1)
diviz.push_back(B);
int dim = (1<<(diviz.size())) - 1;
int nrdiv = diviz.size();
for(int i = 1; i <= dim; ++ i){
long long prod = 1;
int nr = 0;
for(int j = 0; j < nrdiv; ++ j){
if(test(i, j)){
prod = prod * diviz[j];
++ nr;
}
}
if(nr % 2)
sol += (a / prod);
else
sol -= (a / prod);
}
out<<a - sol<<'\n';
}
return 0;
}