Cod sursa(job #703890)

Utilizator CBogdanCiobanu Bogdan CBogdan Data 2 martie 2012 15:12:08
Problema Principiul includerii si excluderii Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<cstdio>
#include<bitset>
#include<vector>
using namespace std;

int i,t,j,n;
long long  A,B,fact[500];
void eratostene();
vector<int> prime;
bitset<1000050> isprime;
int main()
{
	freopen("pinex.in","r",stdin);
	freopen("pinex.out","w",stdout);
	scanf("%d",&n);
	eratostene();
	vector<int>::iterator it;
	for(;n--;)
	{
		scanf("%lld%lld",&A,&B);
		it=prime.begin();
		t=0;
		while(B>1)
		{
			if(it==prime.end())break;
			if(B%*it==0)
			{
				fact[++t]=*it;
				while(B%*it==0)B/=*it;
			}
			if(*it* *it>B&&B>1)
			{
				fact[++t]=B;
				B=1;
			}
			it++;
		}
		long long sol=A;
		int lim=1<<t;
		for(i=1;i<lim;i++)
		{
			long long prod=1;
			int nr=0;
			for(j=0;j<t;j++)
			{
				if((1<<j)&i)
				{
					prod*=fact[j+1];
					nr++;
				}
			}
			if(nr%2)nr=-1;
			else    nr=1;
			sol+=nr*A/prod;
		}
		printf("%lld\n",sol);
	}
}

void eratostene()
{
	prime.push_back(2);
	for(int i=3;i<=1000;i++)
	{
		if(isprime[i]==0)
		{
			prime.push_back(i);
			for(int j=i*i;j<=1000000;j+=i)
			{
				isprime[i]=1;
			}
		}
	}
}