Mai intai trebuie sa te autentifici.
Cod sursa(job #521656)
Utilizator | Data | 13 ianuarie 2011 00:47:38 | |
---|---|---|---|
Problema | Principiul includerii si excluderii | Scor | 70 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 2.23 kb |
//#include<fstream.h>
//ifstream f("pinex.in"); ofstream g("pinex.out");
#include<stdio.h>
char ciur[1000005]; //ciur[i] == 0 daca i este prim
long long a,b,sum,s,pr,p[100001],d[30];
int T,i,j,n,nr=0,m,k,x[30];
void prelsol()
{long long pr=1;
for(int i=1; i<=n; i++) pr=pr*d[x[i]];
s+=a/pr;
}
void back()
{s=0; pr=1; k=1; x[k]=0;
do {while(x[k]<m-n+k)
{x[k]++;
pr*=d[x[k]];
if(k==n)
{s+=a/pr;
pr/=d[x[k]];
}// prelsol();
else {k++; x[k]=x[k-1];};
}
k--;
if(k)pr/=d[x[k]];
}
while(k);
if(n%2) sum+=s; else sum-=s;
}
int main()
{freopen("pinex.in","r",stdin);
freopen("pinex.out","w",stdout);
for(i=2; i<=500000; i++)
if(!ciur[i])
{p[++nr]=i;
for(j=i+i; j<=1000000; j+=i) ciur[j]=1;
};
// f>>T;
scanf("%ld",&T);
while(T)
{//f>>a>>b;
scanf("%lld%lld",&a,&b);
m=0; i=1;
while(b>1 && p[i]*p[i]<=b)
{if(b%p[i]==0)
{d[++m]=p[i];
while(b%p[i]==0) b/=p[i];
};
i++;
}
if(b>1) d[++m]=b;
sum=0;
for(n=1; n<=m; n++)
back();
//g<<a-sum<<'\n';
printf("%lld\n",a-sum);
T--;
}
//g.close();
return 0;
}
/*
#include<stdio.h>
#include<math.h>
long long a;
long long b;
bool c[1000011];
long p[800011];
long e[800011];
void desc ()
{
long lim,d,ex=0,num=1,n,ns,v,bi,w=0,nb,i;
long long prod=1,s=0;
lim=sqrt(b);
n=b;
d=2;num=1;
while (d<=lim && b>1)
{
ex=0;
while (b%d==0)
{
b=b/d;
ex++;
}
if (ex)
e[++w]=d;
num++;
d=p[num];
}
if (b>1)
e[++w]=b;
ns=(1<<w)-1;
for (v=1;v<=ns;v++)
{
prod=1;nb=0;
for (bi=0;bi<w;bi++)
if (v&(1<<bi))
{
prod=(long long)prod*e[w-bi];
nb++;
}
if (nb&1)
s=(long long)s+a/prod;
else
s=(long long)s-a/prod;
}
printf("%lld\n",a-s);
}
void ciur()
{
long i,j;
c[1]=1;
p[1]=2;
p[0]=1;
for (i=2;i<=1000010;i=i+2)
c[i]=1;
for (i=3;i<=1000010;i=i+2)
{
if (!c[i])
{
p[++p[0]]=i;
for (j=i+i+i;j<=1000010;j=j+(i<<1))
c[j]=1;
}
}
}
int main()
{
long m,i;
freopen("pinex.in","r",stdin);
freopen("pinex.out","w",stdout);
scanf("%ld",&m);
ciur();
for (i=1;i<=m;i++)
{
scanf("%lld%lld",&a,&b);
desc();
}
return 0;
}
*/