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)\) 。
显然,函数 \(p(n) = \sum\limits_{d\mid n}d\times \varphi(d)\) 是个积性函数,用埃氏筛法求出 \(\forall (1\leq i\leq n)p(i)\)。
复杂度: \(O(nlog_2n + 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;
}
标签:frac,gcd,limits,LCMSUM,题解,sum,mid,times,SPOJ
From: https://www.cnblogs.com/Vancezyx/p/17051579.html