Pagini recente » Cod sursa (job #1648896) | Profil Rodik_Rody | Monitorul de evaluare | Cod sursa (job #2434664) | Cod sursa (job #664643)
Cod sursa(job #664643)
#include<cstdio>
#include<math.h>
using namespace std;
int m,d,nd,i,j,k,n,p,x,nrp[500001];
long long b,a,s,div[100100];
bool prim[1000001];
void divizori(long long n)
{
int t=1;
while(nrp[t]<=d)
{
if(n%nrp[t]==0)
{
nd++;
div[nd]=nrp[t];
while(n%nrp[t]==0) n=n/nrp[t];
}
t++;
}
if(n>1)
{
nd++;
div[nd]=n;
}
}
int main()
{
freopen("pinex.in","r",stdin);
freopen("pinex.out","w",stdout);
k=1;nrp[1]=2;
for (i=3; i<1000000; i+=2)
if (!prim[i])
{
k++;
nrp[k]=i;
j=3*i;
while(j<1000000)
{
prim[j]=true;
j=j+2*i;
}
}
scanf("%d\n",&m);
for(i=1;i<=m;i++)
{
scanf("%lld %lld\n",&a,&b);
nd=0;s=a;d=floor(sqrt(b));
divizori(b);
for(j=1;j<1<<nd;j++)
{
p=1;x=j;n=0;
for(k=1;k<=nd;k++)
{
if(x%2==1)
{
p=p*div[k];
n++;
}
x=x/2;
}
if(n%2==1) s=s-a/p;
else s=s+a/p;
}
printf("%lld\n",s);
}
fclose(stdin);fclose(stdout);
return 0;
}