[HEOI2016/TJOI2016]求和
XV.[HEOI2016/TJOI2016]求和
题意:求一个东西
其中为第二类斯特林数,递推公式为。
我们终于可以像莫反一样,开始喜闻乐见地推式子辣!
首先,就让我这个半小时前还在看斯特林数的blog的蒟蒻暂且口胡一下第二类斯特林数的意义吧!
,意为将个球放入个集合(无序!不能隔板法!),且每个集合都非空的方案数。
我们有递推式,可以这样想:如果第个球独立放入一个集合,方案数为;否则,可以把它扔进任何一个集合中,共有种方案。
当然也有通项公式:
再来口胡一下证明:
我们这个相当于枚举这个集合中空集合的数量有个。我们从共个集合中选择个空置,共有种方案;是容斥原理的结果,我们反正这么瞎加加减减就能把所有有空集合的方案全都容斥掉。因为每个元素可以扔进个非空集合中的任何一个,共扔次。显然,这么扔肯定是有序的,不满足集合无序的要求,故分母上有个。
回忆一下,,我们把它带进去,得到:
欧拉!我们就可以把的定义带回原式中了。
原式:
首先,当时,我们有。很显然,因为此时必有空集合存在。因此,我们可以将改为。得到:
改变枚举顺序,先枚举,并把只与有关的东西移出去。
通项公式代进去:
发现这个只与有关,不如就在那边求和,得到
把后面那一大坨拆成与有关的和与有关的:
发现后面是一个卷积的形式。令,
利用等比数列求和的公式,得到。
注意!在这么转换之后,我们要注意到特例:和。在新式子中,会得到奇奇怪怪的结果。直接代入原式子,得到和,记得特判一下!
设,则我们得到:
问题来了,这个是干什么的?
误导你的!自始至终它都一直在那里呆着。
出题人竟如此阴险残暴
代码:
#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
const int G=3;
int n,f[500100],g[500100],lim=1,lg,invlim,rev[500100],ans;
int ksm(int x,int y){
int res=1;
for(;y;x=(1ll*x*x)%mod,y>>=1)if(y&1)res=(1ll*res*x)%mod;
return res;
}
void NTT(int *a,int tp){
for(int i=0;i<lim;i++)if(i<rev[i])swap(a[i],a[rev[i]]);
for(int md=1;md<lim;md<<=1){
int rt=ksm(G,(mod-1)/(md<<1));
if(tp==-1)rt=ksm(rt,mod-2);
for(int stp=md<<1,pos=0;pos<lim;pos+=stp){
int w=1;
for(int i=0;i<md;i++,w=(1ll*w*rt)%mod){
int x=a[pos+i],y=(1ll*w*a[pos+md+i])%mod;
a[pos+i]=(x+y)%mod;
a[pos+md+i]=(x-y+mod)%mod;
}
}
}
if(tp==-1)for(int i=0;i<lim;i++)a[i]=(1ll*a[i]*invlim)%mod;
}
int main(){
scanf("%d",&n);
for(int i=0,fac=1,invfac;i<=n;i++,fac=(1ll*fac*i)%mod){
invfac=ksm(fac,mod-2);
f[i]=(i&1?(mod-invfac)%mod:invfac);
if(i==0)g[i]=1;
else if(i==1)g[i]=n+1;
else g[i]=1ll*(ksm(i,n+1)-1+mod)%mod*ksm(i-1,mod-2)%mod*invfac%mod;
}
while(lim<=2*n+1)lim<<=1,lg++;
invlim=ksm(lim,mod-2);
for(int i=0;i<lim;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<(lg-1));
NTT(f,1),NTT(g,1);
for(int i=0;i<lim;i++)f[i]=(1ll*f[i]*g[i])%mod;
NTT(f,-1);
for(int i=0,fac=1,bin=1;i<=n;i++,fac=(1ll*fac*i)%mod,bin=(bin<<1)%mod)ans=(1ll*fac*bin%mod*f[i]%mod+ans)%mod;
printf("%lld\n",ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?