Cod sursa(job #478181)

Utilizator andunhillMacarescu Sebastian andunhill Data 17 august 2010 17:50:42
Problema Principiul includerii si excluderii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include<fstream>
#include<bitset>
#include<vector>
using namespace std;
#define mn 1000000
ifstream f("pinex.in");
ofstream g("pinex.out");
long long  A,B,M;
bitset<mn+1>v;
vector<long long>primes;
long long a[mn/2];
void ciur()
{	for(long long i=2;i<=mn;i++)
		if(v[i]==0)
		{	for(long long j=i<<1;j<=mn;j+=i)
				v[j]=1;
			primes.push_back(i);
		}
}
void solve()
{	long long aux=B,k=1,s=0,p=1,pf;
	for(long long i=0;1LL*primes[i]*primes[i]<=B && aux!=1;i++)
	{	if(aux%primes[i]==0)
		{	while(aux%primes[i]==0)
				aux/=primes[i];
			a[k]=primes[i];
			k++;
			s+=A/primes[i];
			p*=primes[i];
		}
	}
	if(aux!=1)
		a[k]=aux , s+=A/aux , p*=aux , k++;
	if(k>3)
	{	pf=s+A/p;
		for(i=1;i<k;i++)
			for(j=i+1;j<k;j++)
				pf-=A/(a[i]*a[j]);
		g<<A-pf<<'\n';
	}
	else
		if(k>2)
			g<<A-(s-A/p)<<'\n';
		else
			g<<A-s<<'\n';
}
int main()
{	ciur();
	f>>M;
	for(long long i=1;i<=M;i++)
	{	f>>A>>B;
		solve();
	}
	f.close();
	g.close();
	return 0;
}