Cod sursa(job #3153328)
Utilizator | Data | 29 septembrie 2023 10:21:37 | |
---|---|---|---|
Problema | Principiul includerii si excluderii | Scor | 0 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1 kb |
#include <iostream>
#include <vector>
#include <bitset>
using namespace std;
int main()
{
int t;
cin>>t;
for(int i=0;i<t;i++)
{
int a,b;
cin>>a>>b;
vector <int> div;
int cb=b,d=2;
while(cb>1)
{
int cnt=0;
while(cb%d==0&&cb>1)
{
cb/=d;cnt++;
}
if(cnt)
{
div.push_back(a/d);
}
d++;
if(cb>1&&d*d>cb)d=cb;
}
int k=(1<<div.size());
int sum=0;
for(int i=1;i<k;i++)
{
int p=1,cnt=0;
for(int j=0;j<div.size();j++)
{
if(i & (1<<j))
{
cnt++;
p*=div[j];
}
}
if(p>a)continue;
if(cnt%2==1)sum+=a/p;
else sum-=a/p;
}
cout<<a-sum<<endl;
}
return 0;
}