Cod sursa(job #739541)

Utilizator NikitaUtiuNichita Utiu NikitaUtiu Data 23 aprilie 2012 13:15:54
Problema Principiul includerii si excluderii Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <fstream>
using namespace std;

inline int nr_biti(long long a) {
	int nr_biti = 0;
	while(a != 0) {
		++nr_biti;
		a &= a - 1;
	}
	return nr_biti;
}

int prime[100];

int solve(long long a, long long b) {
	long nr = b;
	int size = 0;
	if(nr % 2 == 0)
		prime[size++] = 2;
	while(nr % 2 == 0) nr /= 2;
	for(int i = 3; nr != 1; i += 2) 
		if(nr % i == 0) {
			prime[size++] = i;
			while(nr % i == 0)
				nr /= i;
		}
	
	int sum = a;
	for(long long i = 1; i < (1LL << size); ++i) {
		long long prod = (nr_biti(i) % 2 == 1 ? -1 : 1);
		for(int j = 0; (1LL << j) <= i; ++j)
			if(((1LL << j) & i) != 0)
				prod *= prime[j];
		sum += a / prod;
	}
	return sum;
}

int main(void) {
	int n;
	long long a, b;
	ifstream fin("pinex.in");
	ofstream fout("pinex.out");
	fin >> n;
	for(int i = 0; i < n; ++i) {
		fin >> a >> b;
		fout << solve(a, b) << '\n';
	}
	fin.close();
	fout.close();
}