bzoj 4555: [Tjoi2016&Heoi2016]求和 NTT
来源:互联网 发布:200元左右的礼品 知乎 编辑:程序博客网 时间:2024/06/05 00:42
题意
计算这样一个函数的值:
S(i, j)表示第二类斯特林数,递推公式为:
S(i, j) = j ∗ S(i − 1, j) + S(i − 1, j − 1), 1 <= j <= i − 1。
边界条件为:S(i, i) = 1(0 <= i), S(i, 0) = 0(1 <= i)
你能帮帮他吗?
n<=100000
分析
第二类斯特林数S(n,m)在组合数学中的意义就是把n个不同的球放入m个相同的盒子里的方案数。那么显然S(n,m)*m!就是把n个不同的球放到m个不同的盒子里的方案数。
考虑容斥:
若可以有空盒子则方案数为
简单容斥一下即可得到
带进题目所给式子可以得到
将组合数拆开可得
将第一个sigma移到后面去:
那么这就变成了一个卷积形式,直接上NTT即可。
调了超久都不知道哪里错,最后发现原来NTT的过程中的减法是不能把负数变成正数的。
代码
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;const int MAXN=300005;const int MOD=998244353;int n,jc[MAXN],ny[MAXN],a[MAXN],b[MAXN],rev[MAXN],N,lg;int ksm(int x,int y){ int ans=1; while (y) { if (y&1) ans=(LL)ans*x%MOD; x=(LL)x*x%MOD;y>>=1; } return ans;}void NTT(int *a,int f){ for (int i=0;i<N;i++) if (i<rev[i]) swap(a[i],a[rev[i]]); for (int i=1;i<N;i<<=1) { int wn=ksm(3,f==1?(MOD-1)/i/2:MOD-1-(MOD-1)/i/2); for (int j=0;j<N;j+=(i<<1)) { int w=1; for (int k=0;k<i;k++) { int u=a[j+k],v=(LL)w*a[j+k+i]%MOD; a[j+k]=(u+v)%MOD;a[j+k+i]=(u-v)%MOD; w=(LL)w*wn%MOD; } } } int ny=ksm(N,MOD-2); if (f==-1) for (int i=0;i<N;i++) a[i]=(LL)a[i]*ny%MOD;}int main(){ scanf("%d",&n); jc[0]=ny[0]=1; for (int i=1;i<=n;i++) { jc[i]=(LL)jc[i-1]*i%MOD; ny[i]=ksm(jc[i],MOD-2); } for (int i=0;i<=n;i++) { if (i%2==0) a[i]=ny[i]; else a[i]=-ny[i]; b[i]=(LL)(ksm(i,n+1)-1)*ksm(i-1,MOD-2)%MOD*ny[i]%MOD; } b[1]=n+1; for (N=1;N<=n*2;N*=2,lg++); for (int i=0;i<N;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<(lg-1)); NTT(a,1);NTT(b,1); for (int i=0;i<N;i++) a[i]=(LL)a[i]*b[i]%MOD; NTT(a,-1); int ans=0,now=1; for (int i=0;i<=n;i++) { ans=(ans+(LL)now*jc[i]%MOD*a[i]%MOD)%MOD; now=now*2%MOD; } printf("%d",(ans+MOD)%MOD); return 0;}
0 0
- bzoj 4555: [Tjoi2016&Heoi2016]求和 NTT
- bzoj 4555: [Tjoi2016&Heoi2016]求和 (NTT)
- bzoj 4555 [Tjoi2016&Heoi2016]求和
- [BZOJ4555][Tjoi2016&Heoi2016]求和(NTT)
- bzoj4555 [Tjoi2016&Heoi2016]求和(NTT)
- 4555: [Tjoi2016&Heoi2016]求和
- bzoj 4555:[Tjoi2016&Heoi2016]求和 多项式求逆
- [多项式求逆 模板题] BZOJ 4555 [Tjoi2016&Heoi2016]求和
- 【XSY2133】【BZOJ4555】【TJOI2016】【HEOI2016】求和 第二类斯特林数 NTT
- BZOJ4555: [Tjoi2016&Heoi2016]求和
- bzoj4555【TJOI2016&HEOI2016】求和
- Tjoi2016&Heoi2016 求和
- BZOJ4555: [Tjoi2016&Heoi2016]求和
- [第二类斯特林数 组合 分治FFT||多项式求逆] BZOJ 4555 [Tjoi2016&Heoi2016]求和
- bzoj 4554: [Tjoi2016&Heoi2016]游戏
- bzoj 4553: [Tjoi2016&Heoi2016]序列
- bzoj-4551 [Tjoi2016&Heoi2016]树
- BZOJ 4551: [Tjoi2016&Heoi2016]树
- bash脚本
- Mac下安装php7.0+nginx
- 银行卡校验规则(Luhn算法)
- python学习-03
- Ubuntu系统中git每次提交都要输入密码怎么办?
- bzoj 4555: [Tjoi2016&Heoi2016]求和 NTT
- QuickHit 项目
- 软件测试的基本原则
- java二叉树
- windows pip install matplotlib 出错
- 蓝桥杯算法提高——概率计算(概率dp)
- 与 hao123 垃圾战斗
- 网络监测
- 【个人笔记重点,不作为参考】主题:转载的git总结命令