您的位置:首页 > 其它

LightOJ 1007 欧拉函数

2016-11-29 20:18 471 查看
题意:给你两个数a,b,求a到b之间的数的欧拉函数值之和。

欧拉函数φ(x) 表示不大于x的与x互质的数的个数。

φ(x)= x(1-1/P1)(1-1/P2)(1-1/P3)……其中P1,P2,P3…是x的质因数。

又可以表示成φ(x)= x*(P1-1)/P1*(P2-1)/P2*(P3-1)/P3……

预处理出φ(x),然后记录前缀和,假设F
=∑(φ(i))(i=1..n),则最终答案为F[b]-F[a-1]

超级丑的代码:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define Up(a,b,c) for(ull a(b),end##a(c);a<=end##a;++a)
#define Down(a,c,b) for(ull a(b),end##a(c);a>=end##a;--a)
#define sUp(a,c,b) for(ull a(b),end##a(c);a<=end##a;++a)
#define sDown(a,b,c) for(ull a(b),end##a(c);a>=end##a;--a)
typedef unsigned long long ull;
using namespace std;
const ull N=5000000;
ull Phi[5050500];//结果很大,要用unsigned long long!!!!!!!!!!
void Ycl_phi(){
Phi[1]=1;
Up(i,2,N){
if(!Phi[i]){
for(ull j=i;j<=N;j+=i){
if(!Phi[j])Phi[j]=j;
(Phi[j]/=i)*=(i-1);
};
}

Phi[i]*=Phi[i];
Phi[i]+=Phi[i-1];
}
}
int main(){
Ycl_phi();
ull T,l,r;
scanf("%llu",&T);
Up(t,1,T){
scanf("%llu%llu",&l,&r);
printf("Case %llu: %llu\n",t,Phi[r]-Phi[l-1]);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: