UVa 11426 GCD - Extreme (II) (欧拉函数应用·O(N*logN))
题意 令**G(n) = sum{gcd(i, j) | 0 < i < n, i < j <= n}**给你一个n 输出G(n)
令F(n) = sum{gcd(i, n) | 0 < i < n}
那么有递推式G(n) = G(n-1) + F(n) , G(0) = 0
也就是说只用求出F(n) 就能递推求出 G(n)了 而求F(n)就比较容易了
对于i 设x < i , gcd(x,i) = 1即x, n 互质
则**gcd(2/*x, 2/*i) = 2, gcd(3/*x, 3/*i) = 3, …, gcd(k/x, k/i) = k
这样的x的个数就是i的欧拉函数值 那么我们求出i的欧拉函数后 所有的F(k/*i) 都加上k 这样筛一下就能求出一定范围内所有的F函数值了 然后累加上去就是G的函数值了
1 | #include<cstdio> |