Pagini recente » Cod sursa (job #3150154) | Infoarena Monthly 2012, Runda 10 - Clasament | Cod sursa (job #856068) | Cod sursa (job #2288303) | Cod sursa (job #429609)
Cod sursa(job #429609)
#include <stdio.h>
#define max 1000005
#define LL long long
int p[max],d[max],fp[50];
LL A,B;
int t,z;
void ciur(){
int i,j;
for(i=2;i<max;++i){
if(!p[i]) d[++z]=i;
for(j=2*i;j<max;j+=i)
p[j]=1;
}
}
void work(){
LL prod,nr,rez;
int i,j;
fp[0]=0;
for(i=1;i<=z && B/d[i]>0 ;++i)
if(B % d[i]==0){
fp[++fp[0]]=d[i];
while(B % d[i]==0) B/=d[i];
}
if(B>1) fp[++fp[0]]=B;
rez=0;
for(i=1; i<(1<<fp[0]); ++i){
prod=1; nr=0;
for(j=0; (1<<j) <= i; ++j)
if(i & (1<<j) ){
nr++;
prod=(LL)prod * fp[j+1];
}
if(nr&1) rez= rez + A/prod;
else rez= rez - A/prod;
}
printf("%lld\n",A-rez);
}
int main(){
freopen("pinex.in","r",stdin);
freopen("pinex.out","w",stdout);
ciur();
for(scanf("%d",&t); t; --t){
scanf("%d%d",&A,&B);
work();
}
fclose(stdin); fclose(stdout);
return 0;
}