当前位置: 首页 > news >正文

题解:luogu P4948 数列求和

题解:luogu P4948 数列求和

要求:

\[\sum_{i = 1}^{n}{i^k a^i} \]

其中 \(n \leq 10^{18},k \leq 2000\)

这种 \(k\) 次方但是 \(k\) 特别小的一般都是将 \(i^k\) 通过斯特林数展开。

由:

\[x^n=\sum_{i = 0}^{n}{i! \binom{x}{i} {n \brace i}} \]

得:

\[\sum_{i = 1}^{n}{i^k a^i} = \sum_{i = 1}^{n}{a^i \sum_{j = 0}^{k}{j! \binom{i}{j} {k \brace j}}} = \sum_{j = 0}^{k}{j! {k \brace j} \sum_{i = 1}^{n}{a^i {\binom{i}{j}}}} \]

万恶的出题人为了证明这不是多项式题将模数设为了 \(10^9+7\)

不过斯特林数可以直接 \(O(k^2)\) 求。

考虑后面的怎么求,设 \(s_j = \sum_{i = 1}^{n}{a^i {\binom{i}{j}}}\),可以得到:

\[s_j = \sum_{i = 1}^{n}{a^i {\binom{i}{j}}} = \sum_{i = 1}^{n}{a^i {\binom{i - 1}{j}}} + \sum_{i = 1}^{n}{a^i \binom{i - 1}{j - 1}} \]

\[\sum_{i = 1}^{n}{a^i {\binom{i - 1}{j}}} = a \sum_{i = 0}^{n - 1}{a^i \binom{i}{j}} = a (s_j - a^n \binom{n}{j} + [j = 0]) \]

\[\sum_{i = 1}^{n}{a^i \binom{i - 1}{j - 1}} = a \sum_{i = 0}^{n - 1}{a^i \binom{i}{j - 1}} = a (s_{j - 1} - a^n \binom{n}{j - 1} + [j = 1]) \]

\[s_j = a (s_j - a^n \binom{n}{j} + [j = 0] + s_{j - 1} - a^n \binom{n}{j - 1} + [j = 1]) \]

\[s_j = \frac{a (-a^n \binom{n}{j} + [j = 0] + s_{j - 1} - a^n \binom{n}{j - 1} + [j = 1])}{1 - a} \]

特别的(其实并不特别):

\[s_0=\frac{1 - a^{n + 1}}{1 - a} \]

时间复杂度 \(O(k)\)

观察上式,发现当 \(a = 1\) 时爆掉了,直接除了 \(0\),那怎么办?

其实直接带入:

\[s_j = a (s_j - a^n \binom{n}{j} + [j = 0] + s_{j - 1} - a^n \binom{n}{j - 1} + [j = 1]) \]

就好了,得到:

\[s_{j - 1} = \binom{n}{j} - [j = 0] + \binom{n}{j - 1} - [j = 1] \\ s_{j} = \binom{n}{j} + \binom{n}{j + 1} - [j = 0] \]

最终答案为:

\[\sum_{i = 0}^{k}{i! {k \brace i} s_i} \]

复杂度 \(O(k^2)\)\(O(k\log k)\)

一处细节:\(\binom{n}{i} = \binom{n}{i - 1} \times \frac{n - i + 1}{i}\),这个东西直接递推求就行。

代码:

#include <iostream>using namespace std;#define QED return 0const int mod = 1e9 + 7, N = 2000 + 10;#define int long longint s[N], a, n, k, w[N][N];int qpow(int x, int b)
{int res = 1;while (b){if (b & 1ll) res = res * x % mod;x = x * x % mod;b >>= 1ll;}return res;
}signed main()
{ios :: sync_with_stdio(false), cin.tie(0), cout.tie(0);cin >> n >> a >> k;w[0][0] = 1;for (int i = 1; i <= k; i++){for (int j = 1; j <= k; j++){w[i][j] = (j * w[i - 1][j] % mod + w[i - 1][j - 1]) % mod;}}if (a == 1){int C = 1;for (int i = 0; i <= k; i++){int tmpC = C;if (i != 0) C = C * (n % mod - i + mod + 1) % mod * qpow(i, mod - 2) % mod;tmpC = C;C = C * (n % mod - (i + 1) + mod + 1) % mod * qpow((i + 1), mod - 2) % mod;s[i] = (C + tmpC - (i == 0)) % mod;C = tmpC;}}else{s[0] = (qpow(a, n + 1ll) - a) * qpow(a - 1, mod - 2) % mod;int C = 1;for (int i = 1; i <= k; i++){s[i] = a * (s[i - 1] - C * qpow(a, n) % mod + mod + (i == 1)) % mod;C = C * (n % mod - i + mod + 1) % mod * qpow(i, mod - 2) % mod;s[i] += a * (-C * qpow(a, n) % mod + mod) % mod;s[i] = s[i] * qpow(1 + mod - a, mod - 2) % mod;}}int fac = 1, ans = 0;for (int i = 0; i <= k; i++) fac = fac * max(1ll, i) % mod, ans = (ans + fac * w[k][i] % mod * s[i] % mod) % mod;cout << ans << '\n';QED;
}
http://icebutterfly214.com/news/447/

相关文章:

  • 10.27 CSP-S模拟40 改题记录
  • 详细介绍:Redis多租户资源隔离方案:基于ACL的权限控制与管理
  • 20251027周一日记
  • 学校协同云盘怎么选?2025年10大热门教育网盘推荐与对比
  • GPU集群之间的交互
  • CF1267G Game Relics
  • 102302115方朴第一次作业
  • 解题报告-梦熊 CSP-S2025 模拟赛T2
  • 鄙“站”麻将和算24,刷新后会换
  • 20232422 2025-2026-1 《网络与系统攻防技术》实验三实验报告
  • 20232404 2025-2026-1 《网络与系统攻防技术》实验三实验报告
  • 「WC2014-紫荆花之恋」题解
  • 谢谢你周医生
  • 来源未知
  • Date 10.27
  • 10.27及动手动脑
  • go包装bing搜索
  • 鼾声识别芯片方案和睡眠产品的应用场景
  • 2025年工程管理软件公司综合推荐榜:助力建筑行业数字化升级
  • Excel高性能异步导出完整方案!
  • 2025年多功能综合杆厂家排名前十推荐
  • 2025年度在线网站客服系统综合排行榜正式发布
  • JDD Oxygen智能零售论坛 | 《大模型时代的广告营销变革与实践》
  • 2025年市面上新加坡留学品牌、行业内公司及口碑产品推荐排行
  • 11-文件上传
  • TensorFlow与PyTorch深度对比分析:从基础原理到实战选择的完整指南 - 指南
  • Navicat 17 超详细保姆级下载安装教程:附激活工具使用步骤​
  • el-date-picker样式修改
  • 浅谈 Agent 开发工具链演进历程
  • 电梯调度算法结对编程作业