Pagini recente » Cod sursa (job #2287438) | Cod sursa (job #3252394) | Cod sursa (job #2778053) | Cod sursa (job #3183579) | Cod sursa (job #1778679)
#include <cstdio>
using namespace std;
const int NMAX=1000000;
char vaz[NMAX+3];
int prim[NMAX];
int v[NMAX];
int main()
{
freopen("pinex.in","r",stdin);
freopen("pinex.out","w",stdout);
int m,l=0,l1,c;
long long a,b,p,s;
scanf("%d",&m);
for(int i=2;i<=NMAX;i++)
if(vaz[i]==0)
{
l++;
prim[l]=i;
for(long long j=1LL*i*i;j<=NMAX;j=j+i)
vaz[j]=1;
}
for(int i=1;i<=m;i++)
{
scanf("%lld%lld",&a,&b);
c=b;l1=0;s=0;
for(int j=1;j<=l;j++)
if(c%prim[j]==0)
{
l1++;v[l1]=prim[j];
while(c%prim[j]==0) c=c/prim[j];
if(c==1) break;
}
if(c>1) {l1++;v[l1]=c;}
for(int j=1;j<=(1<<l1);j++)
{
c=0;p=1;
for(int k=0;k<l1;k++)
if(j&(1<<k)) {c++;p=p*v[k+1];}
if(c>0)
{
if(c%2==1) s=s+a/p;
else s=s-a/p;
}
}
printf("%lld\n",a-s);
for(int j=1;j<=l1;j++) v[j]=0;
}
return 0;
}