Pagini recente » Cod sursa (job #2089743) | Cod sursa (job #210053) | Cod sursa (job #985320) | Cod sursa (job #1151656) | Cod sursa (job #2757553)
#include <cstdio>
#include <bitset>
#include <vector>
using namespace std;
const int Nmax = 1000000 + 6666;
bitset<Nmax> used;
vector<int> primes;
vector<long long> primeDivisors;
void genPrimes()
{
primes.emplace_back(2);
for (int i = 3; i < Nmax; i += 2)
if (!used[i]) {
primes.emplace_back(i);
for (int j = 3; i * j < Nmax; j += 2)
used[i * j] = true;
}
}
void getDivisors(long long B)
{
primeDivisors.clear();
for (int i = 0; primes[i] * primes[i] <= B; ++i)
if (B % primes[i] == 0) {
primeDivisors.emplace_back(primes[i]);
while (B % primes[i] == 0)
B /= primes[i];
}
if (B > 1)
primeDivisors.emplace_back(B);
}
int main()
{
freopen("pinex.in", "r", stdin);
freopen("pinex.out", "w", stdout);
genPrimes();
int M;
scanf("%d", &M);
long long A, B;
for (int t = 0; t < M; ++t) {
scanf("%lld%lld", &A, &B);
getDivisors(B);
int limit = (1 << (int)primeDivisors.size());
long long result = 0;
long long crt;
int bitCount, i, mask;
for (mask = 0; mask < limit; ++mask) {
crt = 1;
bitCount = 0;
for (i = 0; i < (int)primeDivisors.size(); ++i)
if (mask & (1 << i)) {
crt *= primeDivisors[i];
++bitCount;
}
if (bitCount & 1)
result -= A / crt;
else
result += A / crt;
}
printf("%lld\n", result);
}
return 0;
}