Pagini recente » Cod sursa (job #968613) | Cod sursa (job #1882306) | Cod sursa (job #3230235) | Cod sursa (job #209906) | Cod sursa (job #1567718)
#include <fstream>
using namespace std;
ifstream cin("pinex.in");
ofstream cout("pinex.out");
#define MAXNR 1000000
int i,j,h,n,m,a,b,nrdivv,auxb,sum,crt, nrzero, crt_sum,crt_poz;
int prim[1000005],nrprim;
int divv[500005];
bool neprim[1000005];
void generare2()
{
for(int i=2; i<=MAXNR; i+=2)
{
i=i;
if(neprim[j]==false)
for(int j=i+i; j<=MAXNR; j+=i)
neprim[j]=true;
}
for(int i=2; i<=MAXNR; i++)
if(!neprim[i])
{
prim[++nrprim]=i;
}
}
int main()
{
cin>>m;
generare2();
for(i=1; i<=m; i++)
{
cin>>a>>b;
nrdivv=0; auxb=b;
//Am format toti factorii primi
for(j=1; j<=nrprim; j++)
{
if(auxb==1 || prim[j] * prim[j] >b)
break;
if( auxb % prim[j] == 0 )
{
divv[++nrdivv] = prim [j];
while(auxb % prim[j] == 0)
auxb /= prim[j];
}
}
if(auxb!=1)
divv[++nrdivv]=auxb;
sum=0;
for(j=1; j <( 1<<nrdivv ); j++ )
{
crt=j; nrzero=0; crt_sum=1; crt_poz=0;
for(h=0; h <=nrdivv; h++)
{
crt_poz++;
if(j & (1<<h) && crt_poz <= nrdivv)
{
nrzero++;
crt_sum= crt_sum * divv[crt_poz] ;
}
}
// cout<<a /crt_sum<<" ";
if(nrzero % 2 == 1)
sum+= ( a / crt_sum );
else
sum-= ( a / crt_sum );
}
// cout<<"\n";
cout<<a-sum<<"\n";
}
}