Pagini recente » Cod sursa (job #623464) | Cod sursa (job #3217808) | Cod sursa (job #689714) | Cod sursa (job #2058508) | Cod sursa (job #2037099)
#include <cstdio>
#include <vector>
#define NMAX 1000005
using namespace std;
FILE *in=fopen("pinex.in","r");
FILE *out=fopen("pinex.out","w");
int n,s,A;
vector <int> fv;
bool prime[NMAX];
vector <int> pri;
void ciur()
{
prime[0]=prime[1]=1;
for(int i=2; i*i<NMAX; i++)
if(prime[i]==0)
{
pri.push_back(i);
for(int j=i*i; j<=NMAX; j+=i)
prime[j]=1;
}
}
void descompunere(int x, vector <int> &v)
{
int ct=0,f,e=0;
f=pri[ct++];
while(x!=1)
{
e=0;
while(x%f==0)
{
e++;
x/=f;
}
if(e)
v.push_back(f);
f=pri[ct++];
}
}
void bk(vector<int> f)
{
if(fv.size()==f.size())
{
int p=1,ct=0;
for(int i=0;i<fv.size();i++)
if(fv[i])
{
p*=f[i];
ct++;
}
if(ct)
{
if(ct%2==1)
s+=A/p;
else s-=A/p;
}
}
else{
for(int i=0;i<=1;i++)
{
fv.push_back(i);
bk(f);
fv.pop_back();
}
}
}
int main()
{
fscanf(in,"%d",&n);
ciur();
while(n)
{
int y;
s=0;
vector <int> factori;
fscanf(in,"%d%d",&A,&y);
descompunere(y,factori);
bk(factori);
while(!fv.empty())
fv.pop_back();
fprintf(out,"%d\n",A-s);
n--;
}
return 0;
}