Cod sursa(job #2649114)

Utilizator BogdanTicuTicu Bogdan Valeriu BogdanTicu Data 13 septembrie 2020 00:48:25
Problema Principiul includerii si excluderii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.93 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("pinex.in");
ofstream out("pinex.out");

bool ciur[1000001];
int prime[100005],k=0;

long long factori[31];
int main()
{
	for(int i=2;i<1000000;i++)
	{
		if(ciur[i]==0)
		{
			ciur[i]=1;
			for(int j=i+i;j<1000000;j+=i)
				ciur[j]=1;
			prime[++k]=i;
		}
	}
	long long n;
	in>>n;
	for(int i=1;i<=n;i++)
	{
		long long a,b,ct=0,cnt=0;
		in>>a>>b;
		long long sol=a;
		while(b>1)
		{
			ct++;
			if(b%prime[ct]==0)
			{
				factori[++cnt]=prime[ct];
				while(b%prime[ct]==0)
					b/=prime[ct];
			}
			if(prime[ct]*prime[ct]>b && b>1)
			{
				factori[++cnt]=b;
				b=1;
			}
		}
		for(int i=1;i<(1<<cnt);i++)
		{
			long long howMany=0,produs=1;
			for(int j=0;j<cnt;j++)
			{
				if((1<<j)&i)
				{
					howMany++;
					produs=1ll*produs*factori[j+1];
				}
			}
				if(howMany%2==0) howMany=1;
				else howMany=-1;

				sol=sol+1ll*howMany*(a/produs);
		}
		out<<sol<<"\n";
	}
	return 0;
}