Pagini recente » Cod sursa (job #2649131) | Cod sursa (job #1553436) | Cod sursa (job #2058454) | Cod sursa (job #1632128) | Cod sursa (job #1902938)
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
ifstream f("pinex.in");
ofstream g("pinex.out");
#define lim 1000002
bool ciur[lim + 1];
vector <int> pri;
inline void CIUR() {
for(unsigned long long i = 2;i <= lim;i++)
if(!ciur[i]) {
pri.push_back(i);
for(long long j = 1LL * i * i;j <= lim;j++)
ciur[j] = 1;
}
}
inline unsigned long long sqrt1(unsigned long long a) {
unsigned long long r = 0, pas = 1 << 30;
while(pas) {
if((r + pas) * (r + pas) <= a)
r += pas;
pas >>= (unsigned long long)1;
}
return r;
}
unsigned long long A, B;
unsigned long long v[lim];
inline void desc() {
unsigned long long x = B, sqr = sqrt1(B);
v[0] = 0;
for(unsigned int i = 0;x != 1 && pri[i] <= sqr && i < pri.size();i++)
if(x % pri[i] == 0) {
v[++v[0]] = pri[i];
while(x % pri[i] == 0)
x /= pri[i];
}
if(x != 1) {
v[++v[0]] = x;
}
}
unsigned long long ans;
void bkt(unsigned long long k, unsigned long long p, unsigned long long nr) {
if(k == v[0] + 1) {
if(p != (unsigned long long)1 && p != 0) {
if(nr & 1)
ans += A / p;
else
ans -= A / p;
}
return;
}
bkt(k + 1, p, nr);
bkt(k + 1, p * v[k], nr + 1);
}
int main() {
unsigned long long M;
f >> M;
CIUR();
while(M) {
M--;
ans = (unsigned long long)0;
f >> A >> B;
desc();
bkt(1, (unsigned long long)1, 0);
g << A - ans << "\n";
}
f.close(), g.close();
return 0;
}