Cod sursa(job #1977869)
Utilizator | Victor Popa victore | Data | 6 mai 2017 13:01:01 |
---|---|---|---|
Problema | Principiul includerii si excluderii | Scor | 30 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.42 kb |
#include<cstdio>
const int nmax=1e6+5;
long long div[nmax],prime[nmax],nrpr,top,sol,nr,i,j,a,b,prod;
bool ciur[nmax];
int t;
int main()
{
freopen("pinex.in","r",stdin);
freopen("pinex.out","w",stdout);
ciur[1]=1;
for(i=2;i<=100;i++)
{
if(!ciur[i])
{
prime[++nrpr]=i;
for(j=i;j<=nmax;j+=i)
ciur[j]=1;
}
}
scanf("%d",&t);
while(t)
{
sol=top=0;
scanf("%lld%lld",&a,&b);
if(b==0)
{
printf("%lld/n",a);
continue;
}
if(a==0)
{
printf("0\n");
continue;
}
for(i=1;prime[i]*prime[i]<=b;i++)
{
if(!(b%prime[i]))
{
div[++top]=prime[i];
while(!(b%prime[i]))
b/=prime[i];
}
}
if(b!=1)
div[++top]=b;
for(i=1;i<(1<<top);i++)
{
nr=0;
prod=1;
for(j=0;j<top;j++)
{
if(((1<<j)&i)!=0)
{
nr++;
prod*=div[j+1];
}
}
if(nr%2)
nr=1;
else
nr=-1;
sol+=1LL*nr*(a/prod);
}
printf("%lld\n",a-sol);
t--;
}
}