题意

定义 $f(i)$ 为非 $i$ 因子的最小正整数,现给出正整数 $n$ ,求 $\sum_{i=1}^nf(i)$ $10^9+7$ 取模后的值。

$n\leq10^{16}$

题解

傻逼题。枚举每个 $f(i)$ 的贡献即可。要容斥掉已经统计的部分。复杂度大概 $\mathcal{O}(1)$

代码

const int N = 1, mod = 1e9 + 7;

inline ll Read() {
	ll x = 0, f = 1;
	char c = getchar();
	while (c != '-' && (c < '0' || c > '9')) c = getchar();
	if (c == '-') f = -f, c = getchar();
	while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + c - '0', c = getchar();
	return x * f;
}

namespace Main {
	ll n, ans;
	ll pri[18] = {0, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 49, 53, 59};
	int cnt[18];
	int main () {
		for (int t = Read(); t--; ) {
			n = Read(); ans = 0;
			for (int i = 1; i <= 14; i++) cnt[i] = 0;
			for (int i = 2; i <= 59; i++) {
				ll cur = i;
				for (int j = 1; j <= 17; j++) {
					for (int k = 1; k <= cnt[j] && cur % pri[j] == 0; k++, cur /= pri[j]);
					if (cur % pri[j] == 0) {
						cnt[j]++;
						cur = pri[j];
						break;
					}
				}
				ll g = i;
				(ans += (n / cur * (cur - 1) + n % cur) * g % mod) %= mod;
				n /= cur;
			}
			printf ("%lld\n", ans); putchar(10);
		}
		return 0;
	}
}

int main () {
	//freopen("math.in", "r", stdin);
	//freopen("math.out", "w", stdout);
	Main::main();
	return 0;
}
EOF

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。

博客信息

作者
Jayun
时间
2023-11-06 16:17:57
博客类型