Cod sursa(job #664393)

Utilizator roxana_savulescuSavulescu Roxana roxana_savulescu Data 20 ianuarie 2012 01:12:48
Problema Principiul includerii si excluderii Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<stdio.h> 
#include<math.h> 
# include <algorithm> 
using namespace std; 
long long x,numitor,nr1,card,a,i,j,k,l,prim[100100],n,nr; 
bool ch[1000100]; 
long long p[100100]; 
long long b,crer; 
void ciur() { 
	fill(ch + 2,ch +500000, 1); 
	nr=0; 
	for (int i = 2;i<500000; i++) 
		if (ch[i]) { 
			for (int j = 2 * i; j < 500000; j += i) 
				ch[j] = false; 
			prim[++nr] = i; 
		} 
} 
int main(){    
	freopen("pinex.in","r",stdin); 
	freopen("pinex.out","w",stdout); 
	prim[1]=2; nr=1;  
	ciur(); 
	scanf("%lld\n",&n); 
	for (l=1;l<=n;l++){ 
		scanf("%lld %lld\n",&a,&b); 
		nr=1;k=0;card=0;  
		long long crer=b; 
		while (b>1){ 
			if (b%prim[nr]==0) { 
				k++; 
				p[k]=prim[nr];               
				while (b%prim[nr]==0) 
					b=b/p[k];
			} 
			if(b>1 && prim[nr]>sqrt(crer))  {                   
				p[++k]=b; 
				b=1; 
			} 
			nr++; 
		} 
		for (i=1;i<1<<k;i++){ 
			x=i; 
			numitor=1;
			nr1=0; 
			for (j=1;j<=k;j++){ 
				if (x%2==1){
					numitor=numitor*p[j]; 
					nr1++; 
				} 
				x=x/2; 
			} 
			if (nr1%2==1) card=card+a/numitor; 
			else card=card-a/numitor; 
		} 
		printf("%lld\n",a-card); 
	}; 
	return 0; 
}