Cod sursa(job #759600)

Utilizator cosminx2003Cosmin Clapon cosminx2003 Data 18 iunie 2012 18:50:22
Problema Principiul includerii si excluderii Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <iostream>
#include <fstream>
#include <cmath>
#define MAXP 20000
#define MAXV 110000
#define MAXF 100

using namespace std;

ifstream f("pinex.in");
ofstream g("pinex.out");

int prime[MAXP],v[MAXV],factors[MAXF];

int sieve(int n) {
	long long i,j;
	int k = 0;

	prime[k++] = 2;
	for(i = 3; i < n; i += 2)
		if(!v[i]) {
			prime[k++] = i;
			for(j = i*i; j <= n; j += i)
				v[j] = true;
		}
	return k;
}

int factorize(long long n) {
	int k = 0, sqr = ceil(sqrt(n)), d = 0;

	while(n > 1 && prime[k] <= sqr) {
		if(n%prime[k] == 0) {
			n /= (long long)prime[k];
			if(factors[d-1] != prime[k])
				factors[d++] = prime[k];
		}
		else {
			k++;
		}
	}
	if(n > 1) {
		factors[d] = n;
		return d+1;
	} else
		return d;
}

int main() {
	int m,a,b,i,j,nrf,nr,s,k;
	long long prod;

	sieve(MAXP);
	
	f>>m;
	for(k = 0; k < m; k++) {
		f>>a>>b;
		nrf = factorize(b);

		s = 0;
		for(i = 1; i < (1<<nrf); i++) {
			prod = 1;
			nr = 0;
			for(j = 0; j < nrf; j++) {
				if((1<<j) & i) {
					prod = prod * (long long)factors[j];
					nr++;
				}
			}
			s += a/prod * ((nr %2) ? -1 : 1);
		}
		g<<s+a<<"\n";
	}

	return 0;
}