[多项式下降幂][组合][二项式定理]luogu P6620 [省选联考 2020 A 卷] 组合数问题
题面
https://www.luogu.com.cn/problem/P6620
求
其中 是给定的 m 次多项式
分析
这种多项式放在乘积里的有两种思路,一种是拆单项,另一种是转下降幂/上升幂
这题后面还有个 k 相关的组合数,果断转下降幂了,假设转好的下降幂多项式为
由 得
即
原式变为
对于下降幂和组合数,有
用组合数通项与下降幂公式易证
则
把 整理到前面
将枚举 k 改为枚举 k-i
易发现二项式定理的形式
这就是最终式子了,预处理出来就只需要 统计答案,加上斯特林数暴力递推转下降幂
代码

#include <iostream> #include <cstdio> using namespace std; typedef long long ll; const int N=1e3+10; int n,m; ll S[N][N],dexp[N],p,b[N],a[N],x[N],x_1[N],ans; ll Pow(ll x,ll y) {ll ans=1;for (;y;y>>=1,x=x*x%p) if (y&1) ans=ans*x%p;return ans;} int main() { scanf("%d%lld%lld%d",&n,&x[1],&p,&m); for (int i=0;i<=m;i++) scanf("%lld",&a[i]); S[0][0]=1; for (int i=1;i<=m;i++) for (int j=0;j<=i;j++) S[i][j]=(S[i-1][j]*j%p+(j?S[i-1][j-1]:0))%p; x[0]=dexp[0]=1;dexp[1]=n; for (int i=2;i<=m;i++) x[i]=x[i-1]*x[1]%p,dexp[i]=dexp[i-1]*(n-i+1)%p; x_1[m]=Pow(x[1]+1,n-m); for (int i=m-1;~i;i--) x_1[i]=x_1[i+1]*(x[1]+1)%p; for (int j=0;j<=m;j++) for (int i=j;i<=m;i++) (b[j]+=S[i][j]*a[i]%p)%=p; for (int i=0;i<=min(m,n);i++) (ans+=b[i]*dexp[i]%p*x[i]%p*x_1[i]%p)%=p; printf("%lld",ans); }
在日渐沉没的世界里,我发现了你。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构