题意
定义 $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;
}

 CodeForces1542C
CodeForces1542C