Cod sursa(job #526844)

Utilizator Eugen01Vasilescu Eugen Eugen01 Data 29 ianuarie 2011 17:32:46
Problema Principiul includerii si excluderii Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include<stdio.h>
#include<math.h>
#define max 1000000
#define max2 79000


int s,a[max2],b[max2],t,x,y,nr,i,j,n,ok[max];

void ciur()
{
	for (i=2;i<=max;i++)
		if (ok[i]==0)
			for (j=i*2;j<=max;j+=i)
				ok[j]=1;

	nr=0;		
	for (i=2;i<=max;i++)
		if (!ok[i])
		{
			nr++;
			a[nr]=i;
		}
}

void sum(int n)
{
	int i,k,p,nr2;
	
	for (i=1;i<=(1<<n)-1;i++)
	{
		nr2=0;
		k=i;
		p=1;	
		for (j=1;j<=n;j++)
		{
			if (k%2==1) 
				{
					nr2++;
					p*=b[j];
			}
			k/=2;
		}
		if (nr2%2) s+=(y/p);
			else s-=(y/p);
	}
}

void pinex()
{
	int i,q=0;

	for (i=1;i<=nr;i++)
		if (x%a[i]==0)
			{
			while (x%a[i]==0) x/=a[i];
			q++;
			b[q]=a[i];
			if (x==1) break;
		}
		
	if (x!=1)
	{
		q++;
		b[q]=x;
	}
		
	sum(q);		
}

int main()
{
	freopen("pinex.in","r",stdin);
	freopen("pinex.out","w",stdout);
	
	scanf("%d",&t);
	
	ciur();
	
	for (i=1;i<=t;i++)
	{
		scanf("%d%d",&y,&x);
		s=0;
		pinex();
		printf("%d\n",y-s);
	}
	
	return 0;
}