uva11426(gcd + 欧拉函数)
2015-07-26 10:34
369 查看
题意:
给出一个n,求
思路:
设f(n)=gcd(1,n)+gcd(2,n)+……+gcd(n-1,n)。
gcd(x,n)=i是n的约数(x<n),按照这个约数进行分类。设满足gcd(x,n)=i的约束有g(n,i)个,则有f(n)=sum(i*g(n,i))。
而gcd(x,n)=i等价于gcd(x/i,n/i)=1,因此g(n,i)等价于p(n/i).p(x)为欧拉函数。
给出一个n,求
设f(n)=gcd(1,n)+gcd(2,n)+……+gcd(n-1,n)。
gcd(x,n)=i是n的约数(x<n),按照这个约数进行分类。设满足gcd(x,n)=i的约束有g(n,i)个,则有f(n)=sum(i*g(n,i))。
而gcd(x,n)=i等价于gcd(x/i,n/i)=1,因此g(n,i)等价于p(n/i).p(x)为欧拉函数。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define ll long long const int N = 4000001; ll sum ; ll f ; ll p ; int n; void init(){ memset(p, 0, sizeof(p)); p[1] = 1; for(int i = 2; i < N; i++) { if(!p[i]) { for(int j = i; j < N; j += i) { if(!p[j]) p[j] = j; p[j] = p[j] / i * (i - 1); } } } memset(sum, 0, sizeof(sum)); for(int i = 1; i < N; i++) { for(int j = i * 2; j < N; j += i) { sum[j] += i * p[j / i]; } } f[2] = sum[2]; for(int i = 3; i < N; i++) f[i] = f[i - 1] + sum[i]; } int main() { init(); while(scanf("%d", &n) && n) { printf("%lld\n", f ); } }
相关文章推荐
- ubuntu下mysql的常用命令
- 机器学习(5)——过拟合问题
- 【试水CAS-4.0.3】第06节_CAS服务端配置HTTPS
- ajax post方法
- javascript获取当前的时间戳的方法汇总
- Android四大组件及意图和意图过滤器
- C语言中数组越界的例子
- View 和 ViewGroup 的 hasFocusable
- BigDecimal 类运算
- vim 配置
- 利用git bash的工作流程
- uva 11059 Maximum Product
- Object-C 属性
- LINUX C获取文件大小 http://my.oschina.net/mavericsoung/blog/138769
- Java IO学习【10】装饰设计模式
- java线程的中断学习
- 数据结构之冒泡排序
- [知识点]Cantor展开
- Fragment回调接口应用间分享数据
- [LeetCode] Palindrome Linked List