90pts求助
查看原帖
90pts求助
217577
kemkra楼主2021/5/9 23:36

自认为正确的题解里好像没有的90分做法(WA了一个点)

#include <cstdio>

typedef long long ll;

const int N = 2000010;

int n;
int prime[N], phi[N], cnt;
bool p[N];
ll sphi[N], ans;

void sieve() {
	prime[1] = 2;
	phi[1] = 1;
	for (int i = 1; i <= n; i++) p[i] = 1;
	for (int i = 2; i < n; i++) {
		if (p[i]) {
			prime[++cnt] = i;
			phi[i] = i - 1;
		}
		for (int j = 1; i * prime[j] <= n && j <= cnt; j++) {
			p[i * prime[j]] = 0;
			if (i % prime[j] == 0) {
				phi[i * prime[j]] = phi[i] * prime[j];
				break;
			}
			phi[i * prime[j]] = phi[i] * phi[prime[j]];
		}
	}
}

int main() {
	scanf("%d", &n);
	sieve();
	sphi[1] = phi[1];
	for (int i = 2; i <= n; i++) sphi[i] = sphi[i - 1] + phi[i];
	for (int i = 1; i <= n; i++) ans += i * sphi[n / i];
	ans -= n * (n + 1) / 2;
	printf("%lld", ans);
	return 0;
}
2021/5/9 23:36
加载中...