Pagini recente » Cod sursa (job #187935) | Cod sursa (job #307837) | Cod sursa (job #2777867) | Cod sursa (job #1526992) | Cod sursa (job #1228858)
#include <cstdio>
#define limciur 1000000
using namespace std;
int t;
long long nrp[500000],v[100],a,b,i,j,nr,sol,x,y,lim,rez;
char ciur[1000010];
int main()
{
freopen("pinex.in", "r", stdin);
freopen("pinex.out", "w", stdout);
for(i=2;i<=limciur;i++)
if(!ciur[i])
{
nrp[++nr]=i;
for(j=i*i;j<=limciur;j+=i) ciur[j]=1;
}
for(scanf("%d",&t);t;t--)
{
scanf("%lld%lld",&a,&b);
sol=0;
for(i=1;i<=nr && nrp[i]*nrp[i]<=b;i++)
if(b%nrp[i]==0)
{
while(b%nrp[i]==0) b/=nrp[i];
v[++sol]=nrp[i];
}
if(b>1) v[++sol]=b;
lim=(1<<sol)-1;
rez=0;
for(i=1;i<=lim;i++)
{
x=1;y=0;
for(j=1;j<=sol;j++)
if(i&(1<<(j-1)))
{
x*=v[j];
y++;
}
if(y%2) rez+=a/x;
else rez-=a/x;
}
printf("%lld\n",a-rez);
}
return 0;
}