Pagini recente » Cod sursa (job #654894) | Cod sursa (job #1657989) | Cod sursa (job #1336290) | Cod sursa (job #2742041) | Cod sursa (job #2728445)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ("pinex.in");
ofstream fout ("pinex.out");
const int maxN = 1e6;
int prim[maxN+5], fact[80005], k;
long long divp[35];
void ciur() {
prim[0] = prim[1] = 1;
for(int i = 2; i * i <= maxN; ++i) {
if(prim[i] == 0) {
for(int j = i*i; j <= maxN; j += i)
prim[j] = 1;
}
}
for(int i = 2; i <= maxN; ++i)
if(prim[i] == 0)
fact[++k] = i;
}
long long solve(long long a, long long b) {
long long t = 0, j = 0;
while(b != 1) {
j += 1;
if(b % fact[j] == 0)
divp[++t] = fact[j];
while(b % fact[j] == 0) {
b /= fact[j];
}
if(fact[j] * fact[j] > b && b > 1) {
divp[++t] = b;
b = 1;
}
}
long long ras = a;
for(int i = 1; i < (1 << t); ++i) {
long long cnt = 0, ans = 1;
for(int j = 0; j < t; ++j)
if((1 << j) & i) {
ans = 1ll * ans * divp[j + 1];
cnt += 1;
}
if(cnt % 2 == 1) cnt = -1;
else cnt = 1;
ras = ras + 1ll * cnt * a / ans;
}
return ras;
}
int main()
{
int n; fin >> n;
ciur();
for(int i = 1; i <= n; ++i) {
long long a, b; fin >> a >> b;
fout << solve(a, b) << "\n";
}
return 0;
}