Pagini recente » Cod sursa (job #1596587) | Cod sursa (job #2104525) | Cod sursa (job #2867372) | Cod sursa (job #276650) | Cod sursa (job #2878728)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ipair pair<int, int>
ifstream fin("pinex.in");
ofstream fout("pinex.out");
const int mxP=1e6;
ll a, b, ans;
bool use[20], prime[mxP+1];
vector<ll> primes, factors;
void primeNumbers()
{
for(int i=2; i*i<=mxP; i++)
if(!prime[i])
for(int j=i*i; j<=mxP; j+=i)
prime[j]=1;
primes.push_back(2);
for(int i=3; i<=mxP; i+=2)
if(!prime[i])
primes.push_back(i);
}
vector<ll> primeFactors(ll x)
{
vector<ll> ans;
int i=0;
while(x>1)
{
int p=0;
while(x%primes[i]==0)
{
x/=primes[i];
p++;
}
if(p)
ans.push_back(primes[i]);
i++;
if(i==primes.size() || primes[i]*primes[i]>x)
{
ans.push_back(x);
x=1;
}
}
return ans;
}
void solution()
{
int cnt=0;
ll p=1;
for(int i=0; i<factors.size(); i++)
if(use[i])
{
cnt++;
p*=factors[i];
}
if(cnt==0)
return;
if(cnt%2==1)
ans+=a/p;
else
ans-=a/p;
}
void backtracking(int step)
{
for(int i=0; i<=1; i++)
{
use[step]=i;
if(step==factors.size()-1)
solution();
else
backtracking(step+1);
}
}
void solve()
{
fin >> a >> b;
if(b==1)
{
fout << a << "\n";
return;
}
factors=primeFactors(b);
ans=0;
backtracking(0);
fout << a-ans << "\n";
}
int main()
{
int t;
fin >> t;
primeNumbers();
for(int i=0; i<t; i++)
solve();
return 0;
}