欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

美味果冻(牛客练习赛53B)

发布时间:2023/12/4 61 豆豆
生活随笔 收集整理的这篇文章主要介绍了 美味果冻(牛客练习赛53B) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

美味果冻

∑i=1n∑j=1ii×⌊ij⌋j∑i=1n∑j=inj×⌊ji⌋i\sum_{i = 1} ^{n} \sum_{j = 1} ^{i} i \times \lfloor \frac{i}{j} \rfloor ^ j\\ \sum_{i = 1} ^{n} \sum_{j = i} ^{n} j \times \lfloor \frac{j}{i} \rfloor ^ i\\ i=1nj=1ii×jiji=1nj=inj×iji

接下来只需要从小到大枚举iii,因为有j∈[ki,(k+1)i],⌊ji⌋=kj \in[ki, (k + 1)i], \lfloor \frac{j}{i} \rfloor = kj[ki,(k+1)i],ij=k,所以这里有一个分块性质,差分前缀和即可得到。

最后在得到的数组中乘上一个数组下标,在求一次前缀和即是答案了。

#include <bits/stdc++.h>using namespace std;const int N = 3e6 + 10, mod = 1e9 + 7;int f[N], g[N], n;void init() {for (int i = 1; i < N; i++) {g[i] = 1;}for (int i = 1; i < N; i++) {for (int j = i; j < N; j += i) {int l = j, r = j + i;g[j / i] = 1ll * g[j / i] * (j / i) % mod;int cur = g[j / i];f[l] = (f[l] + cur) % mod;if (r < N) f[r] = (f[r] - cur + mod) % mod;}}for (int i = 1; i < N; i++) {f[i] = (f[i - 1] + f[i]) % mod;} }int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);init();scanf("%d", &n);int ans = 0;for (int i = 1; i <= n; i++) {ans = (ans + 1ll * i * f[i] % mod) % mod;}printf("%d\n", ans);return 0; }

总结

以上是生活随笔为你收集整理的美味果冻(牛客练习赛53B)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。