Cod sursa(job #664634)

Utilizator the@EyE@Postavaru Stefan the@EyE@ Data 20 ianuarie 2012 15:37:54
Problema Principiul includerii si excluderii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<cstdio>
#define MAX 1000000

using namespace std;
long long b,a,s,m,d,nd;
int div[MAX],primes[MAX];
char ciur[MAX];


void CreateCiur()
{
    int i=2;
    primes[0]=0;
    while(i<MAX)
    {
        if(ciur[i]!=1)
        {
            ++primes[0];
            primes[primes[0]]=i;
            long long j=i;
            for(j;j<MAX;j+=i)
            ciur[j]=1;
        }
        ++i;
    }
}

void divizori(long long n)
{
		for(int i=1;n>1&&i<=primes[0];++i)
			if(n%primes[i]==0)
			{
				nd++;
				div[nd]=primes[i];
				while(n%primes[i]==0) n=n/primes[i];
			}
	if(n>1)
	{
		nd++;
		div[nd]=n;
	}
}
int main()
{
	freopen("pinex.in","r",stdin);
	freopen("pinex.out","w",stdout);
	CreateCiur();
	scanf("%d\n",&m);
	for(int i=1;i<=m;++i)
	{
		scanf("%lld %lld\n",&a,&b);
		nd=0;s=a;
		divizori(b);
		for(long long j=1;j<1<<nd;++j)
		{
			long long p=1,x=j,n=0;
			for(int 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;
}