SPOJ LCMSUM 题解
LCMSUM
题意: 求:
\(\sum\limits_{i=1}^n\lim(i,n)\)
数据范围:\(1\leq T \leq 3\times 10^5\), \(1 \leq n \leq 10^6\)。
原式
\(=\sum\limits_{i=1}^n \frac{i\times n}{\gcd(i, n)}\)
\(=n\times\sum\limits_{i=1}^n \frac{i}{\gcd(i, n)}\)
\(=n\times\sum\limits_{d\mid n}\sum\limits_{i=1}^n (\frac{i}{d}\times[\gcd(i,n) = d])\)
\(=n\times\sum\limits_{d\mid n}\sum\limits_{i=1}^{n\over d} (i\times[\gcd(i,\frac{n}{d}) = 1])\)
\(=n\times\sum\limits_{d\mid n}f(\frac{n}{d})\)
\(=n\times\sum\limits_{d\mid n}f(d)\)
这里 \(f(n)\) 表示 \([1,n]\) 中与 n 互质的数的和。
有: \(f(n) = \dfrac{n\times \varphi(n)}{2}\)
因为 \(\gcd(n, x) = \gcd(n, n - x)\),与 x 不互质的数字 \(x, n-x\) 永远成对出现。
但是 1 是一个特殊的数 \(f(1) = 1\)。
令:
\(g(x) = n\times\sum\limits_{d\mid n}f(d)\)
\(= \frac{n}{2}\times(1+\sum\limits_{d\mid n}d\times \varphi(d))\)
这里的 +1 是指 \(\varphi(1)\times 1\) 。
显然,函数 \(p(n) = \sum\limits_{d\mid n}d\times \varphi(d)\) 是个积性函数,用埃氏筛法求出 \(\forall (1\leq i\leq n)p(i)\)。
复杂度: \(O(n\log n + T)\),不过可以用线筛求积性函数,那是 \(O(n + T)\) 的
AcCode:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6;
int v[N+1], phi[N+1];
ll p[N+1];
vector<int> ve;
void init() {
phi[1] = 1;
for (int i = 2; i <= N; i++) {
if (!v[i]) {
v[i] = i;
phi[i] = i - 1;
ve.push_back(i);
}
for (auto j : ve) {
if (j > i || j > N / i) break;
v[i * j] = j;
phi[i * j] = phi[i] * ((i % j) ? j - 1 : j);
}
}
for (int i = 1; i <= N; i++)
for (int j = 1; j * i <= N; j++)
p[i * j] += phi[i] * 1ll * i;
}
int main() {
init();
int T, n;
scanf("%d", &T);
while (T--) {
scanf("%d", &n);
printf("%lld\n", n * 1ll * (1 + p[n]) / 2);
}
return 0;
}
本文作者:weirdoX
本文链接:https://www.cnblogs.com/weirdoX/p/17051579.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步