ACM模板 欧拉函数
2015-08-25 23:03
309 查看
对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。例如euler(8)=4,因为1,3,5,7均和8互质。
Euler函数表达通式:euler(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…(1-1/pn),其中p1,p2……pn为x的所有素因数,x是不为0的整数。euler(1)=1(唯一和1互质的数就是1本身)。
欧拉公式的延伸:一个数的所有质因子之和是euler(n)*n/2。
那么如何变成实现欧拉函数呢?下面通过两种不同的方法来实现。第一种方法是直接根据定义来实现,同时第一种方法也是第二种筛法的基础,当好好理解。
Euler函数表达通式:euler(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…(1-1/pn),其中p1,p2……pn为x的所有素因数,x是不为0的整数。euler(1)=1(唯一和1互质的数就是1本身)。
欧拉公式的延伸:一个数的所有质因子之和是euler(n)*n/2。
那么如何变成实现欧拉函数呢?下面通过两种不同的方法来实现。第一种方法是直接根据定义来实现,同时第一种方法也是第二种筛法的基础,当好好理解。
//直接求解欧拉函数 int euler(int n){ //返回euler(n) int res=n,a=n; for(int i=2;i*i<=a;i++){ if(a%i==0){ res=res/i*(i-1);//先进行除法是为了防止中间数据的溢出 while(a%i==0) a/=i; } } if(a>1) res=res/a*(a-1); return res; } //筛选法打欧拉函数表 #define Max 1000001 int euler[Max]; void Init(){ euler[1]=1; for(int i=2;i<Max;i++) euler[i]=i; for(int i=2;i<Max;i++) if(euler[i]==i) for(int j=i;j<Max;j+=i) euler[j]=euler[j]/i*(i-1);//先进行除法是为了防止中间数据的溢出 }
相关文章推荐
- python安装第三方库gevent
- onfoq的android周报
- 通知中心
- Android一个小球弹跳的例子,希望对大家有用
- C#开发微信公众平台-就这么简单
- hdoj 1569 方格取数(2) 【最小割】 【最大点权独立集】
- JavaSE复习日记 : java包机制
- UIImageView
- linux进程编程入门
- TCP/IP协议详解-TCP简介与TCP建立与终止
- iOS 分类的基本使用(更改frame)以及全局变量.pch的使用
- LeetCode 30 Substring with Concatenation of All Words 解法为Hashmap
- Zookeeper集群搭建+Kafka集群搭建--55
- Android游戏开发之数独课时----4
- java.util.ConcurrentModificationException异常
- javascript 解析JSONArray和JSONObject
- 云 虚主机探索之经验总结
- Mybatis的xml配置实例
- 发送HTTP请求
- 关于 pace 有意思的一篇文章