Function! (纯数学题)
https://nanti.jisuanke.com/t/42386
有意义的是 平方和公式 (n * (n + 1) * (2 * n + 1 )) / 6
a > sqrt(n) 必然是1, 推个公式ans = (ans + (sqr + m) % mod * (m + 1 - sqr) % mod * (m + 1) % mod * inv2 % mod - col(m) + col(sqr - 1) + mod) % mod;
然后计算a < sqrt(n) 时情况
ll inv2 = inv(2, mod);
ll inv6 = inv(6, mod);
inline ll qmod(ll x){
if(x > mod) x -= mod;
return x;
}
void init() {
return;
}
inline ll col(ll x) {
return x * (x + 1) % mod * qmod(2 * x + 1) % mod * inv6 % mod;
}
void solve() {
ll n; scanf("%lld", &n);
ll sqr = sqrt(n) + 1;
ll ans = 0;
for (int i = 2; i < sqr; ++i) {
ll count = 1, cnt = i, up = n - i + 1;
ll tmp = 0;
while (1) {
ll num = cnt * i - cnt;
tmp = (tmp + min(up, num) * count) % mod;
if (num >= up) break;
up -= num;
cnt += num;
count++;
}
ans = (ans + i * tmp) % mod;
}
ll m = n % mod;
ans = (ans + (sqr + m) % mod * (m + 1 - sqr) % mod * (m + 1) % mod * inv2 % mod - col(m) + col(sqr - 1) + mod) % mod;
printf("%lld\n", ans);
}
signed main() {
//ll n, m;
//test();
//init();
ll t = 1;
//t = rd();
while (t--) solve();
//while (~scanf("%lld %lld", &m, &n)) solve(m, n);
return 0;
}