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;
}
 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号