Pagini recente » Cod sursa (job #532650) | Cod sursa (job #98157) | Cod sursa (job #1579804) | Cod sursa (job #1073747) | Cod sursa (job #690200)
Cod sursa(job #690200)
#include <fstream>
#include <cmath>
using namespace std;
long long sol,prod,a,b;
int rad;
int D,Div[100002],m;
bool neprim[1000002];
int prime[100002],pr=0;
void ciur()
{
for(int i=2;i<=1000000;i++)
if(!neprim[i])
{
prime[++pr]=i;
for(int j=i+i;j<=1000000;j+=i)
neprim[j]=1;
}
}
void divizori()
{
int d=0;
D=0;
while(b>1 and prime[d+1]<rad)
{
d++;
if(b%prime[d]) continue;
while(b%prime[d]==0) b/=prime[d];
Div[++D]=prime[d];
}
if(b!=1) Div[++D]=b;
}
void solutie()
{
int d;
sol=a;
long long prod;
for(int i=1;i<(1<<D);i++)
{
prod=1; d=0;
for(int j=0;j<D;j++)
if(i&(1<<j)){d++; prod=prod*Div[j+1];}
if(d%2) sol-=a/prod; else sol+=a/prod;
}
}
int main()
{
ifstream fi("pinex.in");
ofstream fo("pinex.out");
ciur();
fi>>m;
while(m--)
{
fi>>a>>b;
rad=(int)sqrt((double)a);
divizori();
solutie();
fo<<sol<<"\n";
}
return 0;
}