[多项式下降幂][组合][二项式定理]luogu P6620 [省选联考 2020 A 卷] 组合数问题

题面

https://www.luogu.com.cn/problem/P6620

(k=0nf(k)×xk×(nk))mod P

其中 f(k) 是给定的 m 次多项式

分析

 这种多项式放在乘积里的有两种思路,一种是拆单项,另一种是转下降幂/上升幂

这题后面还有个 k 相关的组合数,果断转下降幂了,假设转好的下降幂多项式为 g(x)=i=0mbixi_

xi=j=0i{ij}xj_

f(x)=i=0maixi=i=0maij=0i{ij}xj_

f(x)=j=0mxj_i=jm{ij}ai

bi=j=im{ji}aj

原式变为 k=0ni=0mbiki_xk(nk)

i=0mbik=0nki_xk(nk)

对于下降幂和组合数,有

km_(nk)=nm_(nmkm) 

用组合数通项与下降幂公式易证

i=0mbik=0nxkni_(niki)

ni_ 整理到前面

i=0mbini_k=0nxk(niki)

将枚举 k 改为枚举 k-i

i=0mbini_k=0nixk+i(nik)

i=0mbini_xik=0nixk(nik)

易发现二项式定理的形式

i=0mbini_xi(x+1)ni

这就是最终式子了,预处理出来就只需要 O(m) 统计答案,加上斯特林数暴力递推转下降幂 O(m2)

代码

复制代码
#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);
}
View Code
复制代码

 

posted @   Vagari  阅读(210)  评论(0编辑  收藏  举报
编辑推荐:
· .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语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示