Cod sursa(job #1949305)

Utilizator vlcmodanModan Valentin vlcmodan Data 1 aprilie 2017 21:44:18
Problema Principiul includerii si excluderii Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<stdio.h>
#include<iostream>
#include<math.h>
#include<vector>

#define ull unsigned long long
using namespace std;
#define N 100001
ull n, m, t;

ull a[N];

void initializare()
{
	ull sqr = sqrt(N);
	
	a[0] =a[1]= 0;
	
	for (ull i = 2; i <= sqr; i++)
	{
		if (a[i] == 0)
		{
			for (ull j = i*i; j < N; j +=  i)
			{
				if(a[j]==0)
					a[j] = i;
			}
		}
		if (a[i] == 0)
		{
			//printf("%d\n", i);
		}
	}
}

ull pise(vector<ull> &b, ull x, ull numbers_taken, ull number,ull product,ull poz)
{
	ull sum = 0;
	if (numbers_taken == number)
	{
		return x / product;
	}
	else
	{
		
		for (ull i = poz; i < b.size(); i++)
		{
			sum += pise(b, x, numbers_taken + 1, number, product*b[i], i + 1);
		}
	}
	return sum;
}
ull solve(ull x, ull y)
{
	vector<ull> b(0);
	while (a[y] != 0)
	{
		b.push_back(a[y]);

		ull x = a[y];
		
		while (y%x == 0)
		{
			y /= x;
		}

	}
	b.push_back(y);

	ull sum = 0;
	for (ull i = 1; i <= b.size(); i++)
	{
		if(i%2==1)
			sum += pise(b, x, 0, i, 1, 0);
		else
			sum -= pise(b, x, 0, i, 1, 0);
	}
	return x-sum;
}
int main()
{
	freopen("pinex.in", "r", stdin);
	freopen("pinex.out", "w", stdout);

	scanf("%d", &t);
	
	initializare();
	for (ull i = 1; i <=t; i++)
	{
		ull x, y;
		scanf("%llu %llu", &x, &y);
		printf("%llu\n", solve(x, y));
	}
}