当前位置: 首页 > 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://www.fuzeviewer.com/news/447/

相关文章:

  • 关于springboot+Servlet报错404的问题
  • Codechef Painting Tree 题解 [ 蓝 ] [ 树形 DP ] [ 概率期望 ] [ 分类讨论 ]
  • 【CI130x 离在线】如何运行 curl 脚本
  • 这才是真正的AI NAS!极空间私有云Z2Ultra评测
  • 新东方第三节课名言作文
  • 十月阅读_3
  • 中考_体育
  • 常见问题处理 --- phpstudy启动mysql失败
  • 20232308 2025-2026-1 《网络与系统攻防技术》实验三实验报告
  • 【密码学实战】openHiTLS PKCS12命令行程序: PKCS12文件生成与解析
  • 「CTSC2017-游戏」题解
  • vue3 vue3-form-element表单生成工具 输入框增加后缀
  • 20232402 2025-2026-1 《网络与系统攻防技术》实验三实验报告
  • 掘金2025年:数字化商业浪潮下,如何选对平台与伙伴?一站式多商户商城系统推荐榜发布,多商户商城代理招募/多商户项目合伙人加盟/一站式开店代理项目加盟
  • 为医疗器械行业搭建“数字桥梁”,破解协同效率与合规难题
  • PostgreSQL 服务版
  • 20232307 2025-2026-1 《网络与系统攻防技术》实验三实验报告
  • 2025年10月办公家具公司评价榜:基于真实数据的权威推荐清单
  • vue+antv/x6项目使用问题
  • 《程序员修炼之道:从小工到专家》前五分之一观后感
  • 坐标系与投影关系
  • 用gdb的动态视角看ret2text的实现
  • 1027随笔
  • ask_skill
  • SVN 主分支合并之通过主分支合并子分支执行流程
  • 现代c++编程体验2
  • 化繁为简:解密国标GB28181算法算力平台EasyGBS如何以兼容性与易用性赋能安防集成
  • 计算机毕业设计springboot音乐畅听系统 基于Spring Boot框架的智能音乐播放系统编写 Spring Boot驱动的音乐在线欣赏平台构建
  • vue2 封装组件使用 v-mode【el-radio,el-input】
  • P11993 [JOIST 2025] 迁移计划 题解