Pagini recente » Cod sursa (job #3533) | Cod sursa (job #3227743) | Cod sursa (job #3288235) | Cod sursa (job #2274658) | Cod sursa (job #524022)
Cod sursa(job #524022)
#include<stdio.h>
int i,n,k,m,nr,t,x[30];
long long a,b,S,s,np[100001],d[20];
bool v[1000011];
void nrdiv()
{ long long p=1;
int i;
for(i=1; i<=n; ++i) p=p*d[x[i]];
s=s+a/p;
}
void backtracking()
{ k=1; s=0; x[k]=0;
do
{ while(x[k]<m-n+k)
{ x[k]=x[k]+1;
if(k==n) nrdiv();
else {++k; x[k]=x[k-1];}
}
--k;
} while(k);
if(n%2) S=S+s; else S=S-s;
}
void gennrprime()
{ int i,j;
for(i=2; i<=1000000; ++i)
if(!v[i])
{ np[++nr]=i;
for(j=i+i; j<=1000000; j+=i) v[j]=1;
}
}
int main()
{ FILE *fin, *fout;
fin = fopen ("pinex.in", "r");
fout = fopen ("pinex.out", "w");
fscanf (fin,"%d",&t);
nr=0; gennrprime();
for(;t;--t)
{ fscanf (fin,"%lld%lld",&a,&b);
m=0; i=1;
while(b>1 && np[i]*np[i]<=b)
{ if(!(b%np[i]))
{ d[++m]=np[i];
while(!(b%np[i])) b=b/np[i];
}
++i;
}
if(b>1) d[++m]=b;
S=0;
for(n=1; n<=m; ++n) backtracking();
fprintf (fout,"%lld\n",a-S);
}
fclose(fout); return 0;
}