poj 2480 Longge's problem(积性函数 & 欧拉函数)
2016-01-18 22:26
501 查看
http://poj.org/problem?id=2480
大意:求解 ∑gcd(i, N) 1<=i <=N。
对于最大公约数,它有这样的性质,gcd(n,m1*m2)=gcd(nm1)*gcd(n,m2) 比如gcd(6,12)=gcd(6,3)*gcd(6,4).
我们设f(N)=∑gcd(i, N),那么它也应该是一个积性函数。(积性函数的积是积性函数,积性函数的和是积性函数)
设
其中p是和n互素的数字。
又设
,由积性函数的性质:
(*)
同时我们知道:
欧拉函数有这样的计算方式:
所以得到:
带入(*)中:
写代码:
大意:求解 ∑gcd(i, N) 1<=i <=N。
对于最大公约数,它有这样的性质,gcd(n,m1*m2)=gcd(nm1)*gcd(n,m2) 比如gcd(6,12)=gcd(6,3)*gcd(6,4).
我们设f(N)=∑gcd(i, N),那么它也应该是一个积性函数。(积性函数的积是积性函数,积性函数的和是积性函数)
设
其中p是和n互素的数字。
又设
,由积性函数的性质:
(*)
同时我们知道:
欧拉函数有这样的计算方式:
所以得到:
带入(*)中:
写代码:
#include <iostream> #include <cstdio> #include <cmath> using namespace std; typedef long long LL; int main() { LL n,ans; while(cin>>n){ int len=sqrt(n*1.0); ans=n; LL a=0,p=1; for(int i=2;i<=len;i++){ a=0; if(n%i==0){ a++; n/=i; p=i; while(n%i==0) { a++; n/=i; } ans=ans/p*(p+a*p-a); } } if(n>1){ ans=ans/n*(n+n-1); } printf("%lld\n",ans); } return 0; }
相关文章推荐
- VMware Tools (ubuntu系统)安装详细过程与使用
- VMware Tools (ubuntu系统)安装详细过程与使用
- VMware Tools (ubuntu系统)安装详细过程与使用
- 【Maven权威指南】Maven实战篇:一个简单的Maven项目
- VMware Tools (ubuntu系统)安装详细过程与使用
- ThreadLocal模式的实现机理
- 设计模式
- 贵州烟草大数据之一:零售户聚类
- Android学习小结2
- 读书笔记1.Android启动模式
- 创建一个简单的接口回调
- String之相关函数
- java jsonArray操作
- ajax学习计划
- 4 基于概率论的分类方法:朴素贝叶斯(一)
- 虚拟机装ubuntu (kylin) 时常遇问题
- JAVA标识符
- Java API —— 网络编程
- OC基础day4-继承,self,super,多态,类对象,SEL类型,description,私有方法与私有变量,三种访问限制
- 关于公司保卫菠萝的技术分析