Pagini recente » Cod sursa (job #865180) | Cod sursa (job #1235180) | Cod sursa (job #2501831) | Cod sursa (job #2659484) | Cod sursa (job #3252802)
#include <bits/stdc++.h>
const std :: string FILENAME = "pinex";
std :: ifstream f (FILENAME + ".in");
std :: ofstream g (FILENAME + ".out");
const int NMAX = 1e6 + 100;
int q;
long long a;
long long b;
std :: vector <int> p;
std :: bitset <NMAX> c;
std :: vector <int> fact;
void precalc()
{
c[0] = c[1] = true;
for(int i = 2; i <= NMAX; i ++)
{
if(c[i] == false)
{
for(int j = 2; i * j <= NMAX; j ++)
{
c[i * j] = true;
}
}
}
for(int i = 2; i <= NMAX; i ++)
{
if(c[i] == false)
{
p.push_back(i);
}
}
}
inline long long solve()
{
long long ans = a;
for(int mask = 1; mask < (1 << fact.size()); mask ++)
{
int bit = 0;
long long prod = 1;
for(int i = 0; i < (int)fact.size(); i ++)
{
if(mask & (1 << i))
{
prod *= fact[i];
bit ++;
}
}
int semn = (bit % 2 == 0) ? 1 : -1;
ans += semn * (a / prod);
}
return ans;
}
int main()
{
precalc();
f >> q;
while(q --)
{
f >> a >> b;
for(int i = 2; i <= b; i ++)
{
if(b % i == 0 && c[i] == false)
{
fact.push_back(i);
while(b % i == 0)
{
b /= i;
}
}
if(i * i >= b)
{
fact.push_back(b);
break;
}
}
g << solve() << '\n';
fact.clear();
}
return 0;
}