209 字
1 分钟
牛客练习赛 53B
2019-10-12

题目#

题目链接

题意#

求和式: i=1nj=1iiijj\sum_{i=1}^{n}{\sum_{j=1}^{i}{i \lfloor {\frac{i}{j}} \rfloor ^j}}

分析#

更换一下枚举顺序:

j=1ni=jniijj\sum_{j=1}^{n}\sum_{i=j}^{n}{i \lfloor \frac{i}{j} \rfloor ^ j}

可以发现 ii 在 区间 [kj,(k+1)j1][k\cdot j, (k+1)\cdot j-1]ij=k\lfloor \frac{i}{j} \rfloor = k ,因此可以对每个 jj 做分段处理,另外 ijj\lfloor \frac{i}{j} \rfloor ^ j 可以从上一个状态转移过来。

时间复杂度: O(nlogn)O(n \log n)

代码#

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 3e6 + 7;
const int MOD = 1e9 + 7;
ll p[MAXN];
int main () {
for (int i = 1; i <= 3000000; ++i) p[i] = 1;
ll n; cin >> n;
ll ans = 0;
for(ll j = 1; j <= n; ++j) {
ll lim = n/j, l = j, r = min(2 * j - 1, n);
for (ll i = 1; i <= lim; ++i) {
p[i] = p[i] * i % MOD;
ans += (l+r)*(r-l+1)/2%MOD*p[i]%MOD;
ans %= MOD;
l += j; r = min(r + j, n);
}
}
cout << ans << endl;
return 0;
}
牛客练习赛 53B
https://dicer-zz.github.io/posts/niuke-exercise-53/
作者
Dicer
发布于
2019-10-12
许可协议
CC BY-NC 4.0