209 字
1 分钟
牛客练习赛 53B
题目
题意
求和式:
分析
更换一下枚举顺序:
可以发现 在 区间 内 ,因此可以对每个 做分段处理,另外 可以从上一个状态转移过来。
时间复杂度:
代码
#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;}