Pagini recente » Cod sursa (job #664121) | Cod sursa (job #1931172) | Cod sursa (job #3147795) | Cod sursa (job #628766) | Cod sursa (job #1567824)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <bitset>
#define maxim 1000005
using namespace std;
long long int A,B;
int m;
bitset<maxim> prim;
int nprim[80005];
int factori[105];
void descomp(long long int b);
void solve(long long int a,long long int b)
{
descomp(b);
int lmax=(1<<factori[0])-1;
long long int s;
int sum_one;
long long int mm=0;
for(int x=1;x<=lmax;x++)
{
s=1;
sum_one=0;
for(int i=1;i<=factori[0];i++)
if(x & (1<< (i-1)))
{s*=factori[i];
sum_one++;
}
if(sum_one%2==1)
mm+=a/s;
else mm-=a/s;
}
if(b!=1)
printf("%lld\n",a-mm);
else printf("%lld\n",a);
}
void descomp(long long int b)
{
for(int i=1;i<=nprim[0] && nprim[i]<=b && b!=1;i++)
if(b%nprim[i]==0)
{factori[++factori[0]]=nprim[i];
while(b!=1 && b%nprim[i]==0)
b/=nprim[i];
}
if(factori[0]==0)
{
nprim[++nprim[0]]=b;
factori[++factori[0]]=b;
}
}
void ciur()
{
nprim[++nprim[0]]=2;
for(int i=3;i<=maxim;i+=2)
if(prim[i]==0)
{
nprim[++nprim[0]]=i;
for(int j=2*i;j<=maxim;j+=i)
prim[j]=1;
}
}
void read()
{
scanf("%d ",&m);
ciur();
for(int i=1;i<=m;i++)
{
scanf("%lld %lld",&A,&B);
factori[0]=0;
solve(A,B);
}
}
int main()
{
freopen("pinex.in","r",stdin);
freopen("pinex.out","w",stdout);
read();
return 0;
}