Pagini recente » Cod sursa (job #447313) | Cod sursa (job #3030709) | Cod sursa (job #1668297) | Cod sursa (job #3267463) | Cod sursa (job #521662)
Cod sursa(job #521662)
#include<fstream.h>
#include<math.h>
ifstream f("pinex.in"); ofstream g("pinex.out");
char ciur[1000011]; //ciur[i] == 0 daca i este prim
long long a,b,sum,s,pr,d[30];
int T,i,j,n,nr=0,m,k,x[30],r,p[100001];
void prelsol()
{long long pr=1;
for(int i=1; i<=n; i++) pr=pr*d[x[i]];
s+=a/pr;
}
void back()
{s=0; pr=1; k=1; x[k]=0;
do {while(x[k]<m-n+k)
{x[k]++;
pr*=d[x[k]];
if(k==n)
{s+=a/pr;
pr/=d[x[k]];
}// prelsol();
else {k++; x[k]=x[k-1];};
}
k--;
if(k)pr/=d[x[k]];
}
while(k);
if(n%2) sum+=s; else sum-=s;
}
int main()
{for(i=2; i<=1000000; i++)
if(!ciur[i])
{p[++nr]=i;
for(j=i+i; j<=1000000; j+=i) ciur[j]=1;
};
f>>T;
while(T)
{f>>a>>b;
m=0; i=1; r=sqrt(b); s=0;
while(b>1 && p[i]<=r)
{if(b%p[i]==0)
{d[++m]=p[i];
while(b%p[i]==0) b/=p[i];
};
i++;
}
if(b>1) d[++m]=b;
sum=0;
for(n=1; n<=m; n++)
back();
g<<a-sum<<'\n';
T--;
}
g.close();
return 0;
}