Cod sursa(job #629193)

Utilizator Robert29FMI Tilica Robert Robert29 Data 2 noiembrie 2011 20:37:42
Problema Principiul includerii si excluderii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include<stdio.h>
#include<math.h>
FILE*f=fopen("pinex.in","r");
FILE*g=fopen("pinex.out","w");
int m,o,z,k,v[100000];
int a,b,s[20],sol1;
char w[1000001];
void tipar(int x){
	int sol=1;
	int nr=0;
	for(int dd=1;dd<=z;++dd){
		if(s[dd]==1){
			sol*=w[dd];
			nr++;
		}
		if(nr%2)
			sol1+=a/sol;
		else
			sol1-=a/sol;
	}
}
void back(int x){
	if(x>z)
		tipar(z);
	else
		for(int ff=0;ff<=1;++ff){
			s[x]=ff;
			back(x+1);
		}
}
int main(){
	fscanf(f,"%d",&m);
	for(int i=2;i<=1000000;++i)
		if(!w[i]){
			for(int j=2*i;j<=1000001;j+=i)
				w[i]=1;
			v[++k]=i;
		}
	
	for(int o=1;o<=m;++o){
		fscanf(f,"%d%d",&a,&b);
		z=0;
		int x=b;
		int y=sqrt(x);
		for(int j=1;j<=k&&x>1&&v[j]<=y;++j)
			if(x%v[j]==0){
				while(x%v[j]==0)
					x/=v[j];
				v[++z]=v[j];
			}
		back(1);
		fprintf(g,"%d\n",sol1);
	}
	fclose(g);
	fclose(f);
	return 0;
}