Cod sursa(job #1147671)

Utilizator SilverGSilver Gains SilverG Data 20 martie 2014 01:19:37
Problema Principiul includerii si excluderii Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
/*
    Keep It Simple!
*/

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

#include<cstdio>

int C[80000], NrDiv, Div[80000];
bool viz[1000001];
int T, A, B;

void Ciur()
{
	C[++NrDiv] = 2;
	for (int i = 3; i <= 1000001; i+=2)
	if (!viz[i])
	{
		C[++NrDiv] = i;
		for (int j = i; j <= 1000001; j+=i)
			viz[j] = 1;
	}
}

int main()
{
	freopen("pinex.in", "r", stdin);
	freopen("pinex.out", "w", stdout);
	Ciur();
	scanf("%d", &T);
	while (T--)
	{
		scanf("%d%d", &A, &B);
		int NrDivB = 0;
		for (int i = 1; i <= NrDiv && B > 1; i++)
		{
			if (B%C[i] == 0)
			{
				Div[++NrDivB] = C[i];
				while (B%C[i] == 0) { B /= C[i]; }
			}
		}
		int sign = 0, Final = 0, Jos = 1;
		for (int i = 1; i <= (1 << NrDivB); i++)
		{
			sign = 1,Jos = 1;
			for (int j = 1; j <= NrDivB;j++)
			if (i&(1 << (j-1)))
				Jos *= Div[j] , sign = -sign;
				Final += sign*A / Jos;
		}
		printf("%d\n", Final);
	}
	
	return 0;
	
}