UVA 11426 (欧拉函数)
2015-11-19 14:53
281 查看
白书125页例题。
gcd(x,n)所有可能的值是n的约数,要满足gcd(x,n) = i(i是n的约数)必然有gcd (x/i, n/i) = 1,也就是ph(n/i)的值。也就是对于每一个数i,如果i是n的约数,那么i在以n结尾的gcd中出现phi(i)次,这就是i对答案的贡献。
gcd(x,n)所有可能的值是n的约数,要满足gcd(x,n) = i(i是n的约数)必然有gcd (x/i, n/i) = 1,也就是ph(n/i)的值。也就是对于每一个数i,如果i是n的约数,那么i在以n结尾的gcd中出现phi(i)次,这就是i对答案的贡献。
#include <bits/stdc++.h> using namespace std; #define maxn 4000000 long long phi[maxn+5]; long long f[maxn+5], sum[maxn+5]; void init () { //打表 for (int i = 2; i <= maxn; i++) phi[i] = 0; phi[1] = 1; for (int i = 2; i <= maxn; i++) if (!phi[i]) { for (int j = i; j <= maxn; j += i) { if (!phi[j]) phi[j] = j; phi[j] = phi[j] / i * (i-1); } } memset (f, 0, sizeof f); for (int i = 1; i <= maxn; i++) { for (int j = i+i; j <= maxn; j += i) f[j] += i*phi[j/i]; } sum[2] = 1; for (int i = 3; i <= maxn; i++) sum[i] = sum[i-1]+f[i]; return ; } int n; int main () { //freopen ("in", "r", stdin); init (); while (cin >> n && n) { cout << sum << endl; } return 0; }
相关文章推荐
- java身份证合法性校验
- Dijkstra 算法——计算有权最短路径(边有权值)
- ListView源码剖析
- activity的四种加载模式
- java regex possissive relunctant
- 黑马程序员日记-11
- Netty框架初探
- iOS 处理图片的一些小 Tip
- 很好的jsp+servlet+javaBean实现数据分页代码例子
- js倒计时,页面刷新时,不会从头计时
- Fresco和Picasso
- 随记unicode解码问题
- 使用Gaps做手游服务器性能测试的一点心得
- Matlab读取并按帧显示视频代码
- kendoUI 简单增删改查
- Mysql slave 同步错误解决
- Tab滑动
- JAVA实现EXL的导入导出功能
- Lambada表达式
- KVC和KVO基本知识点