出处0.0
用到第二类斯特林数的性质,做法好像很多,我打的是直接ntt,由第二类斯特林数的容斥公式可以推出,我们可以对于每一个i,来一次ntt求出他与所有j组成的第二类斯特林数的值,这个时候我们是O(n^2logn)的,还不如暴力,但是我们发现,对于刚刚提到的容斥的式子,将其化为卷积形式后,其一边的每一项对于每一个i都相同,另一边的每一项是对于所有的i形成一个n项的等比数列,这样我们可以把成等比数列的一边求和,用固定的一边去卷他们的和,这时候的答案的每一项就是所有的i的这一项的和,然后我们再O(n)乘上阶乘和2的次幂就可以了.
(一开始代码打错了,还以为那个公式在S(i,j)不存在的时候是错的……后来手玩了一下才发现他是对的……)
补充:
又用多项式求逆打了一遍,比上面那个做法慢了一倍……
这道题求逆的具体做法参见http://blog.csdn.net/lych_cys/article/details/51512278
感觉好神奇啊,把多项式当成数来推式子……
这个东西感觉有点像CDQ+ntt……

#include <cstdio>
#include <cstring>
#include <algorithm>
const int N=400010;
const int P=998244353;
typedef long long LL;
inline int Pow(int x,int y){int ret=1;while(y){if(y&1)ret=(LL)ret*x%P;x=(LL)x*x%P,y>>=1;}return ret;
}
int A[N],B[N],rev[N],len;
int ai[N],bi[N],ci[N];
int jie[N],ni[N],inv[N],n;
inline void ntt(int *C,int opt){register int i,j,k,w;int wn,temp;for(i=1;i<len;++i)if(i<rev[i])std::swap(C[i],C[rev[i]]);for(k=2;k<=len;k<<=1){wn=Pow(3,(P-1)/k);if(opt==-1)wn=Pow(wn,P-2);for(i=0;i<len;i+=k){w=1;for(j=0;j<(k>>1);++j,w=(LL)w*wn%P){temp=(LL)w*C[i+j+(k>>1)]%P;C[i+j+(k>>1)]=(C[i+j]-temp+P)%P;C[i+j]=(C[i+j]+temp)%P;}}}
}
inline void mul(int *a,int *b,int *c,int n){len=1;while(len<n)len<<=1;int i;for(i=1;i<len;++i)rev[i]=(rev[i>>1]>>1)|((i&1)?(len>>1):0);for(i=0;i<len;++i)A[i]=a[i],B[i]=b[i];ntt(A,1),ntt(B,1);for(i=0;i<len;++i)A[i]=(LL)A[i]*B[i]%P;ntt(A,-1);int Inv=Pow(len,P-2);for(i=0;i<len;++i)c[i]=(LL)A[i]*Inv%P;
}
int main(){scanf("%d",&n);int i,ans=1,temp=1;jie[0]=ni[0]=1,inv[1]=1;for(i=2;i<=n;++i)inv[i]=((-(LL)(P/i)*inv[P%i])%P+P)%P;for(i=1;i<=n;++i)jie[i]=(LL)jie[i-1]*i%P,ni[i]=(LL)ni[i-1]*inv[i]%P;bi[0]=0,bi[1]=n,ai[0]=1,ai[1]=P-1;for(i=2;i<=n;++i)bi[i]=(LL)i*(Pow(i,n)-1+P)%P*ni[i]%P*inv[i-1]%P,ai[i]=(i&1)?(P-ni[i]):ni[i];mul(ai,bi,ci,n+n+2);for(i=1;i<=n;++i)temp=(((LL)temp)<<1LL)%P,ans=(ans+(LL)ci[i]*temp%P*jie[i])%P;printf("%d\n",ans);return 0;
}

直接ntt

#include <cstdio>
#include <cstring>
#include <algorithm>
typedef long long LL;
const int N=100010;
const int P=998244353;
inline int Pow(int x,int y){int ret=1;while(y){if(y&1)ret=(LL)ret*x%P;x=(LL)x*x%P,y>>=1;}return ret;
}
int len,n,A[N<<2],rev[N<<2];
int g[N<<2],f[N<<2],jie[N],ni[N];
inline void ntt(int *C,int opt){register int i,j,k,w;int wn,temp;for(i=1;i<len;++i)if(rev[i]>i)std::swap(C[i],C[rev[i]]);for(k=2;k<=len;k<<=1){wn=Pow(3,(P-1)/k);if(opt==-1)wn=Pow(wn,P-2);for(i=0;i<len;i+=k){w=1;for(j=0;j<(k>>1);++j,w=(LL)w*wn%P){temp=(LL)w*C[i+j+(k>>1)]%P;C[i+j+(k>>1)]=(C[i+j]-temp+P)%P;C[i+j]=(C[i+j]+temp)%P;}}}
}
inline void Inv(int *a,int *b,int cd){if(cd==1){b[0]=Pow(a[0],P-2);return;}Inv(a,b,cd>>1);int i,inv;len=cd<<1;for(i=1;i<len;++i)rev[i]=(rev[i>>1]>>1)|((i&1)?(len>>1):0);memcpy(A,a,cd<<2),memset(A+cd,0,cd<<2);ntt(A,1),ntt(b,1);for(i=0;i<len;++i)b[i]=(2-(LL)A[i]*b[i]%P+P)*b[i]%P;ntt(b,-1),inv=Pow(len,P-2);for(i=0;i<cd;++i)b[i]=(LL)b[i]*inv%P;memset(b+cd,0,cd<<2);
}
int main(){scanf("%d",&n);int i,cd,ans=0;jie[0]=ni[0]=1;for(i=1;i<=n;++i)jie[i]=(LL)jie[i-1]*i%P;ni[n]=Pow(jie[n],P-2);for(i=n-1;i>0;--i)ni[i]=(LL)ni[i+1]*(i+1)%P;g[0]=1;for(i=1;i<=n;++i)g[i]=(-2*ni[i]+P+P)%P;cd=1;while(cd<=n)cd<<=1;Inv(g,f,cd);for(i=0;i<=n;++i)ans=(ans+(LL)f[i]*jie[i])%P;printf("%d\n",ans);return 0;
}

多项式求逆

转载于:https://www.cnblogs.com/TSHugh/p/8480847.html

【BZOJ 4555】[Tjoi2016Heoi2016]求和 多项式求逆/NTT+第二类斯特林数相关推荐

  1. BZOJ 4555 [Tjoi2016Heoi2016]求和

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4555 题解 f(n)=∑i=0n∑j=0iS(i,j)×2j×j!=∑i=0n∑j=0n ...

  2. bzoj#4555. [Tjoi2016Heoi2016]求和

    bzoj#4555. [Tjoi2016&Heoi2016]求和 题目描述 Solution 有一个关于第二类斯特林数的公式: {nm}=1m!∑i(mk)(m−k)n(−1)k\left\{ ...

  3. bzoj5093 图的价值【第二类斯特林数+NTT】

    解题思路: 考虑直接枚举每个点连的边,图中其余点之间随便连,那么直接推式子: ans=n∗2C2n−1∑i=0n−1Cin−1ikans=n*2^{C_{n-1}^2}\sum\limits_{i=0 ...

  4. BZOJ 2159 「国家集训队」Crash 的文明世界(第二类斯特林数,换根DP)【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2159 是 hydro 的 BZOJ ...

  5. BZOJ 3456: 城市规划(dp+多项式求逆)

    传送门 解题思路 这道题就是求带标号的无向连通图个数,首先考虑\(O(n^2)\)的做法,设\(f_i\)表示有\(i\)个节点的无向连通图个数,那么考虑容斥,先把所有的无向图求出,即为\(2^{C( ...

  6. [HEOI2016/TJOI2016]求和(第二类斯特林数)

    题目 [HEOI2016/TJOI2016]求和 关于斯特林数与反演的更多姿势\(\Longrightarrow\)点这里 做法 \[\begin{aligned}\\ Ans&=\sum\l ...

  7. 【洛谷2791】 幼儿园篮球题 第二类斯特林数+NTT

    求 \(\sum_{i=0}^{k}\binom{m}{i}\binom{n-m}{k-i}i^L\) \((1\leqslant n,m\leqslant 2\times 10^7,1\leqsla ...

  8. bzoj 5093 [Lydsy1711月赛]图的价值——第二类斯特林数

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5093 不要见到组合数就拆! 枚举每个点的度数,则答案为 \( n*\sum\limits_{ ...

  9. BZOJ 4555 Luogu P4091 [HEOI2016/TJOI2016]求和 (第二类斯特林数)

    题目链接 (lugou) https://www.luogu.org/problem/P4091 (bzoj) https://www.lydsy.com/JudgeOnline/problem.ph ...

最新文章

  1. 【windows】dos命令查看某个文件夹下所有文件目录列表
  2. 支付宝支付 第十集:支付回调
  3. .NET中DLL“没有可放置在工具箱的组件”—FreeTextBox
  4. 中间件业务在网易轻舟容器平台的性能调优实践
  5. GraphPad Prism 统计教程:简单线性回归原理
  6. 卧槽!微信可以改彩色昵称了!又get一个撩妹小技巧 ~~
  7. 将文件转为stream流_NIO之文件IO
  8. 利用位运算的模四算法
  9. 机器学习实战学习笔记 一 k-近邻算法
  10. 谁记录了mysql error log中的超长信息
  11. 利用文件扫描符恢复数据库.txt
  12. [渝粤教育] 西南科技大学 管理信息系统 在线考试复习资料(2)
  13. 转存文章— 网游加速器实现原理解析
  14. RFC2544吞吐量测试详细步骤-Renix软件操作演示
  15. 如何给multisim中导入9012/9013/8050/8550三极管
  16. Python缩进问题:IndentationError:expectedan indented block
  17. Apache ShenYu 网关正式支持 Dubbo3 服务代理
  18. 简单的一种图像冷暖色温转换(MATLAB)
  19. html静态页面兼职,兼职.html · teayork/master - Gitee.com
  20. 【华为OD机试真题 Java】找出通过车辆最多颜色 (A卷2022Q4)

热门文章

  1. Linux常用基本命令(cut)
  2. [开源].NET数据库访问框架Chloe.ORM
  3. ScalaTour-1.基础
  4. 在linux下安装配置DNS服务器
  5. VBS递归遍历文件夹
  6. 某程序的bug是什么意思?
  7. Reg Infomation
  8. 关于JavaScript中的同步(SYNC)和异步(ASYNC)
  9. Sencha Touch 开发入门
  10. WinXP SSH连接不上虚拟机的解决方法