Pagini recente » Cod sursa (job #1852263) | Cod sursa (job #1111534) | Cod sursa (job #2044201) | Cod sursa (job #176886) | Cod sursa (job #2015273)
#include <fstream>
#include <vector>
#include <cmath>
#include <bitset>
using namespace std;
ifstream cin("pinex.in");
ofstream cout("pinex.out");
const int MAX = 1000005;
const int MAX2 = 1e5;
int Era(vector < long long > &primes) {
int cnt = 0;
bitset < MAX > used;
for (long long i = 2; i <= MAX; i ++) {
if (used[i]) continue;
primes[++ cnt] = i;
for (int j = i + i; j <= MAX; j += i) {
used[j] = true;
}
}
return cnt;
}
void solve(long long a, int cur, int mx, long long aux, vector < int > &sol, vector < long long > &primes, long long &ans) {
if (cur > mx) return;
int lim = 0;
if (sol.size()) {
lim = sol.back();
}
if (lim >= mx) return;
for (int i = lim + 1; i <= mx; i ++) {
aux *= primes[i];
if (cur % 2 == 0) {
ans -= (a / aux);
}
else {
ans += (a / aux);
}
sol.push_back(i);
solve(a, cur + 1, mx, aux, sol, primes, ans);
sol.pop_back();
aux /= primes[i];
}
}
int main() {
int n;
cin >> n;
vector < long long > primes (MAX2);
vector < long long > prime_div(MAX2);
int cnt = Era(primes);
while (n --) {
long long a, b;
cin >> a >> b;
int nr = 0;
for (int i = 1; i <= cnt; i ++) {
if (primes[i] > sqrt(b) + 1) break;
if (b % primes[i] == 0) {
prime_div[++ nr] = primes[i];
}
}
if (nr == 0 and b > 1) {
prime_div[++ nr] = b;
}
vector < int > sol;
long long ans = 0;
solve(a, 1, nr, 1, sol, prime_div, ans);
if (a > ans)
cout << a - ans << '\n';
else
cout << 0 << '\n';
}
}