Pagini recente » Cod sursa (job #2573265) | Cod sursa (job #2393456) | Cod sursa (job #3199834) | Cod sursa (job #2427021) | Cod sursa (job #932613)
Cod sursa(job #932613)
#include<cstdio>
#include<vector>
using namespace std;
#define pb push_back
#define MAX 1000000
#define ll unsigned long long
int M ;
vector<long long > p,d;
bool v[MAX];
ll sol , s , A , B;
void ciur();
void solve(ll A , ll B);
int main()
{
ciur();
freopen("pinex.in" , "r" , stdin );
freopen("pinex.out" , "w" , stdout );
scanf("%d" , &M);
for(;M;--M)
{
scanf("%lld%lld" , &A , &B);
solve(A,B);
}
return 0;
}
void ciur()
{
p.pb(2);
for(int i = 3 ; i <= MAX ; i+=2)
{
if(v[i])continue;
p.pb(i);
for(int j = i*i ; j <= MAX && j >0 ; j += (i<<1))
v[j] = 1;
}
}
void solve(ll A , ll B)
{
d.clear();
for( int j = 0 ;1ll* p[j]*p[j] <= B ; ++j)
if(B%p[j]==0)
{
d.pb(p[j]);
while(B%p[j]==0)
B/=p[j];
}
if(B>1)d.pb(B);
int k = d.size(),nr;
sol = 0;
for(int i = 1 ; i< (1<<k) ; ++i)
{
s = A;nr = 0;
for(int j = 0 ; (1<<j) <= i ; ++j)
if(i&(1<<j))
s = 1LL*s/d[j],nr++;
if(nr%2)sol+=s;
else sol-=s;
}
printf("%lld\n" , A-sol );
}