Pagini recente » Cod sursa (job #1531607) | Cod sursa (job #253433) | Cod sursa (job #1484544) | Cod sursa (job #663092) | Cod sursa (job #1680269)
#include <cstdio>
#define MAX_P 1000005
using namespace std;
int t, curr;
long long Sol, A, B;
bool viz[MAX_P];
int prime[80000], sol[80], fact[80];
void ciur()
{
prime[++prime[0]]=2;
for(int i=3;i<MAX_P;i+=2)
{
if(!viz[i])
{
prime[++prime[0]]=i;
for(int j=i+i+i;j<MAX_P;j+=(i << 1))
viz[j]=1;
}
}
}
void read()
{
scanf("%lld%lld", &A, &B);
}
void back(int k, long long prod, int nr)
{
if(sol[k-1]==fact[0])
return;
for(int i=sol[k-1]+1;i<=fact[0];i++)
{
Sol=Sol+1LL*nr*(A/(1LL*prod*fact[i]));
sol[k]=i;
back(k+1, 1LL*prod*fact[i], -nr);
}
}
void solve()
{
fact[0]=curr=0;
while(B>1)
{
curr++;
if(B%prime[curr]==0)
{
fact[++fact[0]]=prime[curr];
while(B%prime[curr]==0)
B/=prime[curr];
}
if(prime[curr]*prime[curr]>B && B>1)
{
fact[++fact[0]]=B;
B=1;
}
}
Sol=A;
back(1, 1, -1);
printf("%lld\n", Sol);
}
int main()
{
freopen("pinex.in", "r", stdin);
freopen("pinex.out", "w", stdout);
ciur();
scanf("%d", &t);
while(t--)
{
read();
solve();
}
}