Cod sursa(job #1018029)

Utilizator The_DisturbedBungiu Alexandru The_Disturbed Data 28 octombrie 2013 20:03:51
Problema Principiul includerii si excluderii Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include<stdio.h>
int n,i,j,np,p[1000013],nd,q,nr;
long long a,b,x,y,z,d[100];
bool k[1000013];
int main()
{
	freopen("pinex.in","r",stdin);
	freopen("pinex.out","w",stdout);
	scanf("%d",&n);
	for(i=2;i<1000013;++i)k[i]=1;
    i=2;
    while(i*i<1000013)
    {
        if(k[i])
        {
            j=i;
            while(i*j<1000013)
            {
                k[i*j]=0;
                ++j;
            }
			p[np++]=i;
        }
        ++i;
    }
	for(int w=0;w<n;++w)
	{
		scanf("%lld%lld",&a,&b);
		i=0;
		nd=0;
		/*while(b!=1)
		{
			if(b%p[i]==0)
			{
				while(b%p[i]==0)b/=p[i];
				d[nd++]=p[i];
			}
			++i;
		}*/
		for(i=0;i<np,b!=1;++i)
			if(b%p[i]==0)
				{
					while(b%p[i]==0)b/=p[i];
					d[nd++]=p[i];
				}
		if(b!=1)d[nd++]=b;
		q=(long long)1<<nd;
		z=0;
		for(i=1;i<q;++i)
		{
			x=1;
			nr=0;
			for(j=0;j<nd;++j)
				if(i & ((long long)1<<j)) x*=d[j],++nr;
			if(nr%2==0)x=-x;
			z+=(a/x);
		}
		printf("%lld\n",a-z);
	}
	return 0;
}