UVA 11426 GCD - Extreme (II)
2015-04-27 10:14
197 查看
题目大意:
![](http://images.cnitblog.com/blog2015/638074/201504/270956293655476.png)
求G的值,其中1<N<4000001;
解题思路:
假设[1,n-1]中所有的数分别与n的gcd的和记为b
,可以看出G
= G[n-1] + b
,
这样就把题目转换为了求b
。
假设a[x]表示使gcs(n, b) = x成立的b有多少个,b
= a[x1]*x1 + a[x2]*x2 + ...... + a[xk]*xk。
我们只需要求a
.
因为有gcd的性质:gcd(n, b) = x --> gcd(n/x, b/x) = 1;可以用欧拉函数求出a[n/xi]即可。
代码:
![](http://images.cnitblog.com/blog2015/638074/201504/270956293655476.png)
求G的值,其中1<N<4000001;
解题思路:
假设[1,n-1]中所有的数分别与n的gcd的和记为b
,可以看出G
= G[n-1] + b
,
这样就把题目转换为了求b
。
假设a[x]表示使gcs(n, b) = x成立的b有多少个,b
= a[x1]*x1 + a[x2]*x2 + ...... + a[xk]*xk。
我们只需要求a
.
因为有gcd的性质:gcd(n, b) = x --> gcd(n/x, b/x) = 1;可以用欧拉函数求出a[n/xi]即可。
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> using namespace std; #define maxn 4000005 #define LL long long LL a[maxn], b[maxn], dp[maxn]; int main() { int n, i, j; for (i=2; i<maxn; i++) if (!a[i]) for (j=i; j<maxn; j+=i) { if (!a[j]) a[j] = j; a[j] = a[j] / i * (i-1); } //欧拉函数打表 for (i=1; i<maxn; i++) for (j=i*2; j<maxn; j+=i) b[j] += a[j/i]*i; //[1,n-1]中所有的数与n的gcd的和 for (i=2; i<maxn; i++) dp[i] = dp[i-1]+b[i]; //题目所问 while (scanf ("%d", &n), n) printf ("%lld\n", dp ); return 0; }
相关文章推荐
- UVa 11426 - GCD - Extreme (II) 转化+筛法生成欧拉函数表
- 白书例题 uva 11426 GCD - Extreme (II)
- GCD - Extreme (II) UVA - 11426
- 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)
- GCD - Extreme (II) UVA - 11426 (欧拉函数)
- GCD - Extreme (II) UVA - 11426 phi函数运用
- 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) 欧拉函数
- UVA11426 GCD - Extreme (II)---欧拉函数的运用
- uva 11426 GCD Extreme (II)
- UVA - 11426 GCD - Extreme (II)
- UVA 11426 GCD - Extreme (II) 欧拉函数