UVA 11426 GCD Extreme (II)
来源:互联网 发布:淘宝新店铺刷钻 编辑:程序博客网 时间:2024/04/30 14:43
题意:给定N,求∑i<=ni=1∑j<nj=1gcd(i,j)的值。
思路:设f(n) = gcd(1, n) + gcd(2, n) + ... + gcd(n - 1, n) 。
然后得到递推式S(n) = f(2) + f(3) + ... + f(n) —> S(n) = S(n - 1) + f(n);.
这样问题变成如何求f(n)。设g(n, i),表示满足gcd(x, n) = i的个数,这样f(n) = sum{i * g(n, i)}. 问题又转化为求g(n, i), gcd(x, n) = i满足的条件为gcd(x / i, n / i) = 1,因此只要求出欧拉函数phi(n / i),就可以得到与x / i互质的个数,从而求出gcd(x , n) = i的个数,这样整体就可以求解了。(打个欧拉函数的表)
代码:
#include <iostream>#include <cmath>#include <cstdio>using namespace std;typedef long long ll;const int maxn = 4000005;int n;long long phi[maxn], s[maxn], f[maxn];void euler(){ phi[1] = 1; for (int i = 2; i < maxn; i++) { if (phi[i]) continue; for (int j = i; j < maxn; j += i) { if (!phi[j]) phi[j] = j; phi[j] = phi[j] / i * (i - 1); } }}int main(){ euler(); for (int i = 1; i < maxn; i++) { for (int j = i * 2; j < maxn; j += i) { f[j] += phi[j/i] * i; } } s[2] = f[2]; for (int i = 3; i < maxn; i++) s[i] = s[i - 1] + f[i]; while (~scanf("%d", &n) && n) { printf("%lld\n", s[n]); } return 0;}
阅读全文
0 0
- UVA 11426 - GCD - Extreme (II)
- UVA 11426 GCD - Extreme (II)
- uva 11426 GCD Extreme (II)
- UVA - 11426 GCD - Extreme (II)
- UVA:11426 GCD - Extreme (II)
- UVA 11426 GCD - Extreme (II)
- UVA 11426-GCD - Extreme (II)
- UVA 11426GCD - Extreme (II)
- UVA 11426 GCD - Extreme (II)
- UVA 11426 - GCD Extreme(II)
- UVA 11426 GCD Extreme (II)
- UVA 11426 - GCD - Extreme (II) (数论)
- UVA 11426 - GCD - Extreme (II) (数论)
- uva 11426 - GCD - Extreme (II)(数论)
- 【欧拉】 UVA 11426 GCD - Extreme (II)
- 欧拉 uva 11426 - GCD - Extreme (II)
- uva 11426 GCD - Extreme (II) (神奇的GCD)
- UVA 11426 - GCD - Extreme (II) GCD性质例题
- Unity中使用串口的注意事项
- 操作系统
- 在连接WIFI的笔记本上使用putty,NAT模式改成桥接模式就可以了
- javascript闭包浅析
- xlistview网络请求数据以及添加headerview_自动轮播viewpager控件
- UVA 11426 GCD Extreme (II)
- 刷题—— hdu 6181 Two Paths
- C语言-冒泡排序
- Python爬了12万条影评
- java异常捕获的一点感悟
- 网络接收数据缓存机制的分析和改进
- 【Java面试知识点】Java面试知识点汇总
- Android开发培训(05)--创建数据共享
- VirtualBox虚拟机中安装CentOS 7(三)升级CentOS