51Nod-1594-Gcd and Phi
2017-09-05 13:29
411 查看
ACM模版
设 g(d)=∑i=1⌊nd⌋∑j=1⌊nd⌋s[id]∗s[jd][gcd(i,j)=1] f(d)=∑k=1⌊nd⌋g(kd) 所以 f(d)=∑i=1⌊nd⌋∑j=1⌊nd⌋s[id]∗s[jd] 这里的 f 数组预处理一下即可。
所以由于 g(d)=∑i=1⌊nd⌋μi∗f(id) 所以 F(n)=∑d=1ng(d)∗ϕd=∑d=1nϕd∑i=1⌊nd⌋μi∗f(id)
如此这般,套模版就好了。
描述
题解
这个题更准确的描述应该是求 F(n)=∑i=1n∑j=1nϕgcd(ϕi,ϕj) 首先我们可以设 s[i] 表示 1∼n 中欧拉函数等于 i 的数有多少个。那么我们可以得到:F(n)=∑d=1n∑i=1⌊nd⌋∑j=1⌊nd⌋ϕd∗s[id]∗s[jd][gcd(i,j)=1] 此时,反演可以上了。设 g(d)=∑i=1⌊nd⌋∑j=1⌊nd⌋s[id]∗s[jd][gcd(i,j)=1] f(d)=∑k=1⌊nd⌋g(kd) 所以 f(d)=∑i=1⌊nd⌋∑j=1⌊nd⌋s[id]∗s[jd] 这里的 f 数组预处理一下即可。
所以由于 g(d)=∑i=1⌊nd⌋μi∗f(id) 所以 F(n)=∑d=1ng(d)∗ϕd=∑d=1nϕd∑i=1⌊nd⌋μi∗f(id)
如此这般,套模版就好了。
代码
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int MAXN = 2e6 + 5; int n, tot; ll ans; ll s[MAXN]; ll f[MAXN]; int pri[MAXN]; int phi[MAXN]; int miu[MAXN]; bool vis[MAXN]; void solve() { memset(vis, 0, sizeof(vis)); memset(phi, 0, sizeof(phi)); memset(miu, 0, sizeof(miu)); memset(s, 0, sizeof(s)); memset(f, 0, sizeof(f)); ans = tot = 0; miu[1] = phi[1] = 1; for (int i = 2; i <= n; i++) { if (!vis[i]) { pri[tot++] =i ; miu[i] = -1; phi[i] = i - 1; } for (int j = 0, k; j < tot; j++) { k = i * pri[j]; if (k > n) { break; } vis[k] = 1; if (i % pri[j] == 0) { miu[k] = 0; phi[k] = phi[i] * pri[j]; break; } miu[k] = -miu[i]; phi[k] = phi[i] * (pri[j] - 1); } } for (int i = 1; i <= n; i++) { s[phi[i]]++; } for (int i = 1; i <= n; i++) { for (int j = i; j <= n; j += i) { f[i] += s[j]; } } for (int i = 1; i <= n; i++) { f[i] = f[i] * f[i]; } for (int i = 1; i <= n; i++) { if (miu[i] != 0) { for (int d = 1; i * d <= n; d++) { ans += miu[i] * phi[d] * f[i * d]; } } } } int main() { int T; scanf("%d", &T); while (T--) { scanf("%d", &n); solve(); printf("%lld\n", ans); } return 0; }
相关文章推荐
- 【51NOD 1594】Gcd and Phi
- 【51nod】1594 Gcd and Phi
- 51nod 1594 Gcd and Phi
- 51nod 1594 Gcd and Phi 莫比乌斯反演
- [51nod 1594]Gcd and Phi
- [51Nod 1594] Gcd and Phi
- 51NOD 1594:Gcd and Phi——题解
- 51nod 1594 Gcd and Phi
- 51nod 1594 Gcd and Phi
- 51nod_1179_计算N个数之间两两之间GCD的最大值
- Gcd表中的质数 51Nod - 1192 (莫比乌斯反演)
- 51Nod 1011 最大公约数GCD
- 51Nod-1011 最大公约数GCD【欧几里得算法】
- 51Nod 1011 最大公约数GCD
- 51Nod 1011 最大公约数GCD
- 51nod_1011 最大公约数GCD
- 【51NOD-0】1011 最大公约数GCD
- 【51NOD 1192】Gcd表中的质数
- 51NOD 1247 可能的路径 GCD
- [51Nod 2026] Gcd and Lcm