Cod sursa(job #3322352)
| Utilizator | Data | 13 noiembrie 2025 16:21:10 | |
|---|---|---|---|
| Problema | Principiul includerii si excluderii | Scor | 30 |
| Compilator | cpp-64 | Status | done |
| Runda | Arhiva educationala | Marime | 1.2 kb |
#include <bits/stdc++.h>
#define NMAX 1000001
using namespace std;
ifstream fin("pinex.in");
ofstream fout("pinex.out");
long long a,t,b,i,n,j,nrp,v[101],prime[NMAX];
bool ciur[NMAX];
int main()
{
prime[0]=prime[1]=1;
for(i=2;i<=NMAX;i++)
{
if(ciur[i]==0)
{
prime[nrp++]=i;
for(j=2*i;j<NMAX;j+=i)
ciur[j]=1;
}
}
fin>>t;
while(t)
{
fin>>a>>b;
t--;
int k=0;
int i=1;
while(b>1&&prime[i]*prime[i]<=b)
{
if(b%prime[i]==0)
{
v[++k]=prime[i];
while(b%prime[i]==0) b/=prime[i];
}
i++;
}
if(b>1) v[++k]=b;
long long rez=a;
for(i=1;i<(1LL<<k);i++)
{
int nrc=0;
long long p=1;
for(j=0;j<k;j++)
{
if(i&(1LL<<j))
{
nrc++;
p*=v[j+1];
}
}
if(nrc%2==1) rez=rez-a/p;
else rez=rez+a/p;
}
fout<<rez<<'\n';
}
return 0;
}
