大佬们60分蒟蒻求助~~
  • 板块P3601 签到题
  • 楼主FANwry
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/2/28 17:11
  • 上次更新2024/2/28 20:27:53
查看原帖
大佬们60分蒟蒻求助~~
196016
FANwry楼主2024/2/28 17:11
#include <bits/stdc++.h>
using namespace std;
long long int l, r, npr[1000010], ans, phi[1000100], vis[1000100], cnt, pr[1000100];

void prime() {
	for (long long int i = 2; i <= 1000005; i++) {
		if (!npr[i]) {
			cnt++;
			pr[cnt] = i;
		}
		for (long long int j = 1; j <= cnt && pr[j]*i <= 1000005; j++) {
			npr[i * pr[j]] = 1;
			if (i % pr[j] == 0)
				break;
		}
	}
}


int main() {
	scanf("%lld%lld", &l, &r);
	prime();
	for (long long int i = l; i <= r; i++) {
		vis[i - l + 1] = i;
		phi[i - l + 1] = i;
	}
	for (long long int i = 1; pr[i]*pr[i] <= r && i <= cnt; i++) {
		long long int bgin = l / pr[i] * pr[i] + pr[i];
		if (l % pr[i] == 0)
			bgin = l;
		for (long long int j = bgin; j <= r; j += pr[i]) {
			phi[j - l + 1] = phi[j - l + 1] * (pr[i] - 1) / pr[i];
			while (vis[j - l + 1] % pr[i] == 0) {
				vis[j - l + 1] /= pr[i];
			}
		}
	}
	for (long long int i = 1; i <= r - l + 1; i++) {
		if (vis[i] != 1) {
			phi[i] = phi[i] * (vis[i] - 1) / vis[i];
		}
		ans = (ans + (l - 1 + i - phi[i]) % 666623333) % 666623333;
	}
	printf("%lld\n", ans);

}
2024/2/28 17:11
加载中...