题解 P5148 【大循环】

题意简述

给定 qf(x)=i=0maixiaii=0,1,2,3,,m),求出

1a1<a2<<aknf(q)

的值。

思路简述

先对

1a1<a2<<aknf(q)

进行化简:

1a1<a2<<aknf(q)=f(q)1a1<a2<<amn1

1a1<a2<<akn1

可以看做是从 [1,n] 随机选 k 个正整数的选法,有 (nk)=Cnk 种选法。即原式为

f(q)(nk)

对于 (nk),一种比较好的计算方法如下:

(nk)=n!k!(nk)!=i=nk+1nik!

其中, i=1ni=1×2×3××n。注意最后要乘法逆元算组合数。

现在对 f(x) 进行化简。可以利用秦九韶算法。例如:

i=05aixi=x(x(x(x(a5x+a4)+a3)+a2)+a1)+a0

即,把一个 n 次多项式转化为 n 个一次多项式。具体的代码实现可见代码。

知道了这些,代码就很好写了。

代码

#include <bits/stdc++.h> typedef long long ll; #define MOD ((ll)1e9 + 7) using namespace std; ll a[1000005]; ll n, m, k, q; inline ll QuickPower(ll x, ll y, ll mod) { // 快速幂 ll res = 1; while (y) { if (y & 1) res = res * x % mod; y >>= 1; x = (x * x) % mod; } return res; } inline int QJS(int x) { int ans = a[m] % MOD; // 赋初值是因为例子中的“a_0”,避免在最后做一次计算(懒) for (int i = m; i > 0; --i) ans = ((ll)1 * ans * x % MOD + a[i - 1]) % MOD; // 套用秦九韶公式 return ans; } inline ll C(int n, int k) { // 组合数公式 if (k * 2 > n) k = n - k; int QAQ = 1, QwQ = 1; for (int i = n; i >= n - k + 1; i--) QAQ = (ll)1 * QAQ * i % MOD; for (int i = 2; i <= k; i++) // 从 1 开始节省时间 QwQ = (ll)1 * QwQ * i % MOD; // 改成 *= 就玄学报错 return (ll)1 * QuickPower(QwQ, MOD - 2, MOD) * QAQ % MOD; // 乘法逆元 } int main(void) { cin >> n >> m >> k >> q; for (int i = 0; i <= m; i++) cin >> a[i]; cout << (ll)1 * QJS(q % MOD) * C(n, k) % MOD; return 0; }

__EOF__

本文作者David H
本文链接https://www.cnblogs.com/David-H-Devs/p/14175037.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   David_H_Devs  阅读(95)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示