Cod sursa(job #496629)

Utilizator elfusFlorin Chirica elfus Data 29 octombrie 2010 23:50:20
Problema Principiul includerii si excluderii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include<cstdio>
#include<cstring>
#include<math.h>
#define LL long long
using namespace std;

bool ciur[1000010];
LL prime[1000010];
LL T,x[100]; 

void fa_ciur()
{
	long i,j;
	ciur[1]=1;
	prime[1]=2;
	prime[0]=1;
	for (i=2;i<=1000010;i=i+2)
		ciur[i]=1;
	for (i=3;i<=1000010;i=i+2)
	{
		if (!ciur[i])
	{
		prime[++prime[0]]=i;
		for (j=i+i+i;j<=1000010;j=j+(i<<1))
			ciur[j]=1;
	}
	}

}


void desc(LL b)
{
	LL elf=1,lim=(LL)sqrt(b);
	x[0]=0;

	while(b>1 && prime[elf]<=lim)
	{
		if(b%prime[elf]==0)
		{
			x[++x[0]]=prime[elf];
			while(b%prime[elf]==0)

				b/=prime[elf];
		}
	elf++; 
	}
	if(b>1)
		x[++x[0]]=b;
}

void solve(int n,LL k)
{
LL prod,num,i,j,ns=(LL)(1<<n)-1;
T=0;
for(i=1;i<=ns;i++)
{
	prod=1; num=0;
	for(j=0;j<n;j++)
		if(i&(LL)(1<<j))
		{
			prod=(LL)prod*x[n-j];
			num++;
		}
	if(num&1)
		T=(LL)T+k/prod;
	else
		T=(LL)T-k/prod;
}
printf("%lld\n",(LL)k-T);
}

int main()
{
	LL a,b;
	int teste;
	
	freopen("pinex.in","r",stdin);
	freopen("pinex.out","w",stdout);
	
	scanf("%d",&teste); 

	fa_ciur();
	
	while(teste--)
	{
		scanf("%lld%lld",&a,&b);
		desc(b);
		solve(x[0],a);
		
	} 
	return 0; 
}