Cod sursa(job #1193847)

Utilizator EpictetStamatin Cristian Epictet Data 2 iunie 2014 00:05:18
Problema Principiul includerii si excluderii Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <fstream>
#define Max_P 1000000
#define LL long long
using namespace std;
ifstream fin("pinex.in");
ofstream fout("pinex.out");
int nr, Nr_Prim[100000], Fact[33];
LL A, B, SOL;
bool prim[Max_P];

int main()
{
	fin >> nr;
	for (int i = 2; i <= Max_P; i++)
	{
		if (!prim[i])
		{
			Nr_Prim[++Nr_Prim[0]] = i;
			for (int j = i*2; j <= Max_P; j+=i)
				prim[j] = 1;
		}
	}
	
	for (int k = 1; k <= nr; k++)
	{
		fin >> A >> B;
		
		int d = 1, t = 0;
		while (B > 1)
		{
			if (B % Nr_Prim[d] == 0)
			{
				while (B % Nr_Prim[d] == 0)
				{
					B /= Nr_Prim[d];
				}
				Fact[++t] = Nr_Prim[d];	
			}
			d++;
		}
		
		SOL = A;
		for (int i = 1; i <= (1 << t) - 1; i++)
		{
			LL w = 0, Prod = 1;
			for (int j = 0; j <= t - 1; j++)
			{
				if ((1 << j) & i)
				{
					Prod *= Fact[j + 1];
					w++;
				}
			}
			
			if (w % 2) w = -1;
			else w = 1;
			
			SOL += w * A / Prod;
		}
		
		fout << SOL << '\n';
	}
	fout.close();
	return 0;
}