Pagini recente » Cod sursa (job #103112) | Cod sursa (job #1191255) | Cod sursa (job #2056439) | Cod sursa (job #1010325) | Cod sursa (job #1981268)
#include <cstdio>
#include <cmath>
using namespace std;
bool p[1009999];
int v[100005];
int d[100005];
int main()
{
freopen("pinex.in","r",stdin);
freopen("pinex.out","w",stdout);
int nrp=0,t,a,b,sq,m;
scanf("%d",&t);
for(int i=2;i<=1000000;++i)
{
if(p[i]==0)
{
v[++nrp]=i;
int j=i;
while(j<=1000000)
{
j+=i;
if(j>1000000)
break;
p[j]=1;
}
}
}
while(t--)
{
int nrd=0,rez=0,miau=1;
scanf("%d %d",&a,&b);
p[1]=1;
sq=sqrt(b);
if(p[b]==0)
{
nrd=1;
d[1]=b;
}
else{
for(int i=1;v[i]<=sq;++i)
{
if(b%v[i]==0)
{
d[++nrd]=v[i];
while(b%v[i]==0)
b/=v[i];
}
}
if(p[b]==0)
{
nrd++;
d[nrd]=b;
}
}
int pt=1<<nrd;
for(int i=1;i<=pt-1;++i)
{
miau=1;
int ham=0;
for(int j=0;j<nrd;++j)
{
m=1<<j;
if(m&i)
{
miau*=d[j+1];
ham++;
}
}
int semn;
if(ham%2==1)
semn=1;
else
semn=-1;
rez+=semn*(a/miau);
}
printf("%d\n",a-rez);
}
return 0;
}