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;
}
posted @ 2020-12-03 22:24  wansheking  阅读(100)  评论(0)    收藏  举报