Cod sursa(job #664523)

Utilizator sanzianaioneteIonete Sanziana sanzianaionete Data 20 ianuarie 2012 11:49:47
Problema Principiul includerii si excluderii Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include<cstdio>
#include<math.h>
using namespace std;
int m,d,nd,i,j,k,n,p,x;
long long b,a,s,div[100100];
bool prim[1000001];
void divizori(long long n)
{
	if(n%2==0)
	{
		nd=1;
		div[nd]=2;
		while(n%2==0) n=n/2;
	}
	for(int t=3;t<=d;t+=2)
	if(!prim[t])
	if(n%t==0)
	{
		nd++;
		div[nd]=t;
		while(n%t==0) n=n/t;
	}
	if(n>1)
	{
		nd++;
		div[nd]=n;
	}
}
int main()
{
	freopen("pinex.in","r",stdin);
	freopen("pinex.out","w",stdout);
	for(i=3;i<=1000;i+=2)
	{
		if(!prim[i])
		{
			k=3*i;
			while(k<=1000000)
			{
				prim[k]=true;
				k+=2*i;
			}
		}
	}
	scanf("%d\n",&m);
	for(i=1;i<=m;i++)
	{
		scanf("%lld %lld\n",&a,&b);
		nd=0;s=a;d=floor(sqrt(b));
		divizori(b);
		for(j=1;j<1<<nd;j++)
		{
			p=1;x=j;n=0;
			for(k=1;k<=nd;k++)
			{
				if(x%2==1)
				{
					p=p*div[k];
					n++;
				}
				x=x/2;
			}
			if(n%2==1) s=s-a/p;
			else s=s+a/p;
		}
		printf("%lld\n",s);
	}
	fclose(stdin);fclose(stdout);
	return 0;
}