标签:gcd
题目链接:acm.hdu.edu.cn/showproblem.php?pid=1695
GCD 素数+容斥原理
#include<cstdio>
#include<cstring>
const int MAX=100010;
__int64 eular[MAX];
int num[MAX];
int p[MAX][20];
void init()
{
memset(eular,0,sizeof(eular));
memset(num,0,sizeof(num));
eular[1]=1;
for(int i=2;i<MAX;i++)
{
if(!eular[i])
{
for(int j=i;j<MAX;j+=i)
{
if(!eular[j])
eular[j]=j;
eular[j]=eular[j]*(i-1)/i;
p[j][num[j]++]=i;
}
}
eular[i]+=eular[i-1];
}
}
int RC(int n,int now,int t){
int i;
int sum=0;
for(i=t;i<num[now];i++)
sum+=n/p[now][i]-RC(n/p[now][i],now,i+1);
return sum;
}
int main()
{
int t,T;
int a,b,c,d,i,j,k,x;
init();
scanf("%d",&T);
for(t=1;t<=T;t++)
{
scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
if(k==0)
{
printf("Case %d: 0\n",t);
continue;
}
b/=k,d/=k;
if(b>d)
{
x=b;
b=d;
d=x;
}
__int64 sum=eular[b];
for(i=b+1;i<=d;i++)
{
sum+=b-RC(b,i,0);
}
printf("Case %d: %I64d\n",t,sum);
}
return 0;
}标签:gcd
原文地址:http://blog.csdn.net/holyang_1013197377/article/details/45149155