Pagini recente » Cod sursa (job #2720668) | Cod sursa (job #2030616) | Cod sursa (job #752069) | Cod sursa (job #2955724) | Cod sursa (job #925645)
Cod sursa(job #925645)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in ("pinex.in");
ofstream out ("pinex.out");
typedef long long LL;
const int MAXN = 10000000;
long long A, B;
long long Ans;
bool Prim[MAXN + 10];
int st[40];
long long Fact[40];
vector <LL> Prime;
void Ciur ()
{
int i, j;
Prime.push_back (2);
for (i = 3; i * i <= MAXN; i += 2)
if (!Prim[i]){
Prime.push_back (i);
for (j = i * i; j <= MAXN; j += (2 * i))
Prim[j] = 1;
}
}
void update (int lev, LL prod)
{
if (lev & 1)
Ans += (A / prod);
else
Ans -= (A / prod);
}
void back (int lev, LL prod)
{
update (lev, prod);
int i;
for (i = st[lev - 1] + 1; i <= Fact[0]; i ++){
st[lev] = i;
if (prod * Fact[i] > A)
continue;
back (lev + 1, (long long) prod * Fact[i]);
}
}
long long Solve ()
{
int i = 0, N;
N = Prime.size ();
while (B > 1 && i < N && (long long) Fact[i] * Fact[i] <= B){
if (B % Prime[i] == 0){
Fact[++ Fact[0]] = Prime[i];
while (B % Prime[i] == 0)
B /= Prime[i];
}
i ++;
}
if (B > 1)
Fact[++ Fact[0]] = B;
back (1, 1);
return Ans;
}
int main()
{
int T;
Ciur ();
for (in >> T; T; T --){
in >> A >> B;
Ans = 0;
Fact[0] = 0;
out << Solve () << "\n";
}
return 0;
}