I do hope for world peace..|

weirdoX

园龄:2年6个月粉丝:3关注:10

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 中国大陆许可协议进行许可。

posted @   weirdoX  阅读(37)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起