Cod sursa(job #690206)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 25 februarie 2012 13:10:37
Problema Principiul includerii si excluderii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <fstream>
#include <cmath>
using namespace std;
long long sol,prod,a,b;
int rad;
int D,Div[100002],m;
bool neprim[1000002];
int prime[100002],pr=0;
void ciur()
{
	for(int i=2;i<=1000000;i++)
	if(!neprim[i])
	{
		prime[++pr]=i;
		for(int j=i+i;j<=1000000;j+=i)
			neprim[j]=1;
	}
}
void divizori()
{
	int d=0;
	D=0;
	while(b>1 and prime[d+1]<=rad)
	{
		d++;
		if(b%prime[d]) continue;
		while(b%prime[d]==0) b/=prime[d];
		Div[++D]=prime[d];
	}
	if(b!=1) Div[++D]=b;
}
void solutie()
{
	int d;
	sol=a;
	long long prod;
	for(int i=1;i<(1<<D);i++)
	{
		prod=1; d=0;
		for(int j=0;j<D;j++)
		if(i&(1<<j)){d++;  prod=prod*Div[j+1];}
		if(d%2) sol-=a/prod; else sol+=a/prod;		
	}
}
int main()
{
	ifstream fi("pinex.in");
	ofstream fo("pinex.out");
	ciur();
	fi>>m;
	while(m--)
	{
		fi>>a>>b;
		rad=(int)sqrt((double)b);
		divizori();
		solutie();
		fo<<sol<<"\n";
	}
	return 0;
}