Cod sursa(job #1140246)

Utilizator vladrochianVlad Rochian vladrochian Data 11 martie 2014 20:51:17
Problema Principiul includerii si excluderii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <fstream>
#define ll long long
using namespace std;
int m,np,nf,p2[31];
ll p[80000],f[31],a,b,lim,d,nr;
bool c[1000001];
void ciur()
{
	p[0]=2;
	for(int i=3;i<1000000;i+=2)
		if(!c[i])
		{
			p[++np]=i;
			if(i<1000)
				for(int j=i*i;j<1000000;j+=i<<1)
					c[j]=1;
		}
}
ifstream fin("pinex.in");
ofstream fout("pinex.out");
int main()
{
	int i,j,k;
	ciur();
	p2[0]=1;
	for(i=1;i<31;++i)
		p2[i]=p2[i-1]<<1;
	fin>>m;
	while(m--)
	{
		fin>>a>>b;
		nf=-1;
		for(i=0;i<=np && p[i]*p[i]<=b;++i)
			if(!(b%p[i]))
			{
				f[++nf]=p[i];
				while(!(b%p[i]))
					b/=p[i];
			}
		if(b>1)
			f[++nf]=b;
		nr=a;
		lim=p2[++nf];
		for(i=1;i<lim;++i)
		{
			k=0;
			d=1;
			for(j=0;j<nf;++j)
				if(i&p2[j])
				{
					d*=f[j];
					++k;
				}
			if(k&1)
				nr-=a/d;
			else
				nr+=a/d;
		}
		fout<<nr<<"\n";
	}
	return 0;
}