Pagini recente » Cod sursa (job #1475193) | Cod sursa (job #1745899) | Cod sursa (job #2722342) | Cod sursa (job #619253) | Cod sursa (job #2025449)
#include <iostream>
#include <fstream>
#include <bitset>
#include <vector>
#define LIM 1000000
using namespace std;
bitset<LIM> mark;
vector<int> primes;
vector<int> fact;
ifstream in("pinex.in");
ofstream out("pinex.out");
void ciur() {
for (int i = 3; i * i <= LIM; i += 2) {
if (!mark.test(i)) {
for (int j = i * i; j <= LIM; j += 2 * i)
mark.set(j);
}
}
primes.push_back(2);
for (int i = 3; i <= LIM; i += 2)
if (!mark.test(i))
primes.push_back(i);
}
void desc(long long int n) {
int pos = 0;
fact.clear();
while (primes[pos] * primes[pos] <= n) {
if (n % primes[pos] == 0) {
while (n % primes[pos] == 0)
n /= primes[pos];
fact.push_back(primes[pos]);
}
if (++pos == (signed) primes.size())
break;
}
if (n != 1)
fact.push_back(n);
}
int main() {
ciur();
int M, nr_bits;
long long int A, B;
long long int div = 1;
long long int sum = 0;
for (in >> M; M; --M) {
in >> A >> B;
desc(B);
sum = 0;
for (int i = 1; i < (1 << fact.size()); i++)
{
nr_bits = 0;
div = 1LL;
for (int j = 0; (1 << j) <= i; j++)
if (i & (1 << j))
{
nr_bits++;
div *= fact[j];
}
if (nr_bits & 1)
sum += (A / div);
else
sum -= (A / div);
}
out << A - sum << "\n";
}
in.close();
out.close();
return 0;
}