HDU2824 The Euler function(欧拉函数)
2016-02-05 22:10
309 查看
题目求φ(a)+φ(a+1)+...+φ(b-1)+φ(b)。
用欧拉筛选法O(n)计算出n以内的φ值,存个前缀和即可。
φ(p)=p-1(p是质数),小于这个质数且与其互质的个数就是p-1;
φ(p*a)=(p-1)*φ(a)(p是质数且p不能整除a),因为欧拉函数是积性函数,φ(p*a)=φ(p)*φ(a);
φ(p*a)=p*φ(a)(p是质数且p|a),不知怎么理解。。
用欧拉筛选法O(n)计算出n以内的φ值,存个前缀和即可。
φ(p)=p-1(p是质数),小于这个质数且与其互质的个数就是p-1;
φ(p*a)=(p-1)*φ(a)(p是质数且p不能整除a),因为欧拉函数是积性函数,φ(p*a)=φ(p)*φ(a);
φ(p*a)=p*φ(a)(p是质数且p|a),不知怎么理解。。
#include<cstdio> #include<cstring> using namespace std; #define MAXN 3000000 long long phi[MAXN]; int prime[MAXN]; bool vis[MAXN]; void euler(){ phi[1]=1; int tot=0; for(long long i=2; i<MAXN; ++i){ if(!vis[i]){ prime[tot++]=i; phi[i]=i-1; } for(int j=0; j<tot; ++j){ if(i*prime[j]>MAXN) break; vis[i*prime[j]]=1; if(i%prime[j]==0){ phi[i*prime[j]]=phi[i]*prime[j]; break; }else{ phi[i*prime[j]]=phi[i]*(prime[j]-1); } } } } int main(){ euler(); for(int i=2; i<MAXN; ++i) phi[i]+=phi[i-1]; int a,b; while(~scanf("%d%d",&a,&b)){ printf("%lld\n",phi[b]-phi[a-1]); } return 0; }
相关文章推荐
- LeetCode322. Coin Change
- 接口1
- jQuery2(JQuery实现onload)
- 理解javascript中所有的函数参数是按值传递
- junit4X系列--Statement
- c++n连环
- USACO window area 漂浮法
- python 编码格式
- junit4X系列--Runner解析
- struts2学习笔记--struts.xml配置文件详解
- 为什么直接把javascript的代码写进html就行但是调用js文件就不行
- 日志管理
- {A} + {B}
- linux系统如何启用ftp服务
- [LeetCode]Codes of Easy Problem
- HDOJ1238 Substrings
- REDIS源码中一些值得学习的技术细节02
- 猿代码邀请码
- USACO bigborn 最大矩形
- 操作权限构件