Pagini recente » Cod sursa (job #619847) | Cod sursa (job #2069644) | Cod sursa (job #868234) | Cod sursa (job #2068436) | Cod sursa (job #664629)
Cod sursa(job #664629)
#include<cstdio>
#define MAX 1000003
using namespace std;
long long b,a,s,div[MAX],primes[MAX],m,d,nd;
char ciur[MAX];
void CreateCiur()
{
long long i=2;
primes[0]=0;
while(i<MAX)
{
if(ciur[i]!=1)
{
primes[0]++;
primes[primes[0]]=i;
long long j=i;
for(j;j<MAX;j+=i)
ciur[j]=1;
}
++i;
}
}
void divizori(long long n)
{
for(long long i=1;n>1&&i<=primes[0];i++)
if(n%primes[i]==0)
{
nd++;
div[nd]=primes[i];
while(n%primes[i]==0) n=n/primes[i];
}
if(n>1)
{
nd++;
div[nd]=n;
}
}
int main()
{
freopen("pinex.in","r",stdin);
freopen("pinex.out","w",stdout);
CreateCiur();
scanf("%d\n",&m);
for(long long i=1;i<=m;i++)
{
scanf("%I64d %I64d\n",&a,&b);
nd=0;s=a;
divizori(b);
for(long long j=1;j<1<<nd;j++)
{
long long p=1,x=j,n=0;
for(long long k=1;k<=nd;k++)
{
if(x%2==1)
{
p=p*div[k];
n++;
}
x=x/2;
}
if(n%2==1) s=s-a/p;
else s=s+a/p;
}
printf("%I64d\n",s);
}
fclose(stdin);fclose(stdout);
return 0;
}