Cod sursa(job #475957)

Utilizator unknownliviuMaria Liviu Valentin unknownliviu Data 9 august 2010 14:00:16
Problema Principiul includerii si excluderii Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include<fstream>
using namespace std;
ifstream in("pinex.in");
ofstream out("pinex.out");
long long m,a,b;


int d[16],k;
void f_primi(long long x)
{
	long long i;
	for(i=2;i*i<=x;i++)
	{
		if(x%i)
			continue;
		d[++k]=i;
		while(x%i==0)
		{
			x/=i;
		}
	}
	if(x!=1)
		d[++k]=x;
}
bool sol[16];
long long prod[1<<15],nr;
void prelucrare()
{
	
	long long q=0,sum=1;
	for(int i=1;i<=k;i++)
		if(sol[i])
		{
			//out<<i<<" ";
			q++;
			sum*=(long long)d[i];
		}
	if(q%2)
		sum*=-1;
	prod[++nr]=sum;
	//out<<"prod="<<prod[nr]<<"\n";
}
void bkt(int p)
{
	if(p>k)
	{
		prelucrare();
		return;
	}
	sol[p]=0;
	bkt(p+1);
	sol[p]=1;
	bkt(p+1);
}
long long suma(long long x)
{
	long long s=0;
	for(int i=1;i<=nr;i++)
		s+=x/prod[i];
	return s;
}
void reset()
{
	k=0;
	nr=0;
}
int main()
{
	int i;
	in>>m;
	for(i=1;i<=m;i++)
	{
		in>>a>>b;
		f_primi(b);
		bkt(1);
		out<<suma(a)<<'\n';
		reset();
	}
	return 0;
}