Pagini recente » Cod sursa (job #2783229) | Cod sursa (job #1772684) | Cod sursa (job #1253091) | Cod sursa (job #2057777) | Cod sursa (job #2015192)
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream cin("pinex.in");
ofstream cout("pinex.out");
void solve(long long a, int cur, int MAX, long long aux, vector < int > &sol, vector < long long > &primes, long long &ans) {
if (cur > MAX) return;
int lim = 0;
if (sol.size()) {
lim = sol.back();
}
if (lim == MAX) return;
for (int i = lim + 1; i <= MAX; i ++) {
aux *= primes[i];
if (cur % 2 == 0) {
ans -= (a / aux);
}
else {
ans += (a / aux);
}
sol.push_back(i);
solve(a, cur + 1, MAX, aux, sol, primes, ans);
sol.pop_back();
aux /= primes[i];
}
}
int main() {
int n;
cin >> n;
while (n --) {
long long a, b;
cin >> a >> b;
vector < long long > primes(sqrt(b));
long long d = 2;
int cnt = 0;
while (b != 1) {
if (b % d == 0) {
primes[++ cnt] = d;
while (b % d == 0) {
b /= d;
}
}
if (d == 2) {
d = 3;
}
else {
d += 2;
}
}
vector < int > sol;
long long ans = 0;
solve(a, 1, cnt, 1, sol, primes, ans);
cout << a - ans << '\n';
}
}