Pagini recente » Cod sursa (job #3280308) | Cod sursa (job #1895398) | Cod sursa (job #326152) | Cod sursa (job #585648) | Cod sursa (job #1414349)
#include <cstdio>
using namespace std;
long long fact[100];
int nrfact=0;
inline void Descomp(long long x)
{
int k=0;
nrfact=0;
while(x%2==0)
{
x/=2; ++k;
}
if(k) fact[++nrfact]=2;
long long d=3;
while(d*d<=x && x>1)
{
k=0;
while(x%d==0)
{
x/=d; ++k;
}
if(k) fact[++nrfact]=d;
d+=2;
}
if(x>1) fact[++nrfact]=x;
}
inline int Cnt(int x)
{
int sol=0;
for(;x;x=(x&(x-1)),++sol);
return sol;
}
int main()
{
long long A,B,sol;
int i,stare,nr,Q;
freopen ("pinex.in","r",stdin);
freopen ("pinex.out","w",stdout);
scanf("%d", &Q);
while(Q--)
{
scanf("%lld%lld", &A,&B);
Descomp(B); sol=0;
for(stare=1;stare<(1<<nrfact);++stare)
{
nr=Cnt(stare);
long long prod=1;
for(i=0;i<nrfact;++i)
if((stare&(1<<i))) prod*=fact[i+1];
if(nr&1) sol+=A/prod;
else sol-=A/prod;
}
printf("%lld\n", A-sol);
}
return 0;
}