出处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=;
const int P=;
typedef long long LL;
inline int Pow(int x,int y){
int ret=;
while(y){
if(y&)ret=(LL)ret*x%P;
x=(LL)x*x%P,y>>=;
}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=;i<len;++i)if(i<rev[i])std::swap(C[i],C[rev[i]]);
for(k=;k<=len;k<<=){
wn=Pow(,(P-)/k);
if(opt==-)wn=Pow(wn,P-);
for(i=;i<len;i+=k){
w=;
for(j=;j<(k>>);++j,w=(LL)w*wn%P){
temp=(LL)w*C[i+j+(k>>)]%P;
C[i+j+(k>>)]=(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=;while(len<n)len<<=;int i;
for(i=;i<len;++i)rev[i]=(rev[i>>]>>)|((i&)?(len>>):);
for(i=;i<len;++i)A[i]=a[i],B[i]=b[i];
ntt(A,),ntt(B,);
for(i=;i<len;++i)A[i]=(LL)A[i]*B[i]%P;
ntt(A,-);
int Inv=Pow(len,P-);
for(i=;i<len;++i)c[i]=(LL)A[i]*Inv%P;
}
int main(){
scanf("%d",&n);int i,ans=,temp=;
jie[]=ni[]=,inv[]=;
for(i=;i<=n;++i)inv[i]=((-(LL)(P/i)*inv[P%i])%P+P)%P;
for(i=;i<=n;++i)jie[i]=(LL)jie[i-]*i%P,ni[i]=(LL)ni[i-]*inv[i]%P;
bi[]=,bi[]=n,ai[]=,ai[]=P-;
for(i=;i<=n;++i)
bi[i]=(LL)i*(Pow(i,n)-+P)%P*ni[i]%P*inv[i-]%P,ai[i]=(i&)?(P-ni[i]):ni[i];
mul(ai,bi,ci,n+n+);
for(i=;i<=n;++i)
temp=(((LL)temp)<<1LL)%P,ans=(ans+(LL)ci[i]*temp%P*jie[i])%P;
printf("%d\n",ans);
return ;
}

直接ntt

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

多项式求逆

【BZOJ 4555】[Tjoi2016&Heoi2016]求和 多项式求逆/NTT+第二类斯特林数的更多相关文章

  1. BZOJ 4555: [Tjoi2016&Heoi2016]求和 [分治FFT 组合计数 | 多项式求逆]

    4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...

  2. BZOJ 4555 [Tjoi2016&Heoi2016]求和 (多项式求逆)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4555 题目大意: 给定 \(S(n,m)\) 表示第二类斯特林数,定义函数 \(f(n ...

  3. bzoj 4555 [Tjoi2016&Heoi2016]求和 NTT 第二类斯特林数 等比数列求和优化

    [Tjoi2016&Heoi2016]求和 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 679  Solved: 534[Submit][S ...

  4. BZOJ 4555: [Tjoi2016&Heoi2016]求和 [FFT 组合计数 容斥原理]

    4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...

  5. [BZOJ 4555][Tjoi2016&Heoi2016]求和

    题意 给定 $n$ , 求下式的值: $$ f(n)= \sum_{i=0}^n\sum_{j=0}^i\begin{Bmatrix}i\\ j\end{Bmatrix}\times 2^j\time ...

  6. BZOJ 4555:[TJOI2016&HEOI2016]求和(第二类斯特林数+NTT)

    题目链接 \(Description\) 求 \[\sum_{i=0}^n\sum_{j=0}^iS(i,j)2^jj!\]对998244353取模后的结果. \(n<=10^5\) \(Sol ...

  7. bzoj 4555 [Tjoi2016&Heoi2016] 求和 —— 第二类斯特林数+NTT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4555 关于第二类斯特林数:https://www.cnblogs.com/Wuweizhen ...

  8. bzoj 4555 [Tjoi2016&Heoi2016]求和——NTT+第二类斯特林数

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4555 第二类斯特林数展开式: \( S(i,j) = \frac{1}{j!} \sum\l ...

  9. 【bzoj4555】[Tjoi2016&Heoi2016]求和(NTT+第二类斯特林数)

    传送门 题意: 求 \[ f(n)=\sum_{i=0}^n\sum_{j=0}^i\begin{Bmatrix} i \\ j \end{Bmatrix}2^jj! \] 思路: 直接将第二类斯特林 ...

随机推荐

  1. ADO.NET基础学习-----四种模型,防止SQL注入

    1.ExcuteNonQuery 执行非查询语句,返回受影响的行数. // 1.ExcuteNonQuery string sqlconn = "Data Source=wss;Initia ...

  2. 解决jQuery不同版同时引用的冲突

    今天研发的同事在开发一个新jQuery插件时,遇到一个揪心的问题.平台以前使用的 jQuery版本是1.2.6,偶,天啊!这是古代的版本啊! 由于很多功能基于老版本,不能删除啊,同志们都懂的! 于是我 ...

  3. "Generative Adversarial Nets" Notes

    - Ian J.Goodfellow 中文翻译:https://blog.csdn.net/wspba/article/details/54577236 代码实现:https://github.com ...

  4. Python 学习笔记之——用 sklearn 对数据进行预处理

    1. 标准化 标准化是为了让数据服从一个零均值和单位方差的标准正态分布.也即针对一个均值为 \(mean\) 标准差为 \(std\) 的向量 \(X\) 中的每个值 \(x\),有 \(x_{sca ...

  5. eos智能合约开发最佳实践

    安全问题 1.可能的错误 智能合约终止 限制转账限额 限制速率 有效途径来进行bug修复和提升 2.谨慎发布智能合约 对智能合约进行彻底的测试 并在任何新的攻击手法被发现后及时制止 赏金计划和审计合约 ...

  6. 《javascript模式--by Stoyan Stefanov》书摘--汇总

    <javascript模式--by Stoyan Stefanov>书摘--基本技巧 http://www.cnblogs.com/liubei/p/JavascriptModeLog1. ...

  7. 路由器如何设置上网(TP-LINK)

    最近宿舍公用的网络一直不太稳定,正赶上毕业季,本来就打算自己买一台自用的路由器,于是我从一个毕业的师姐手里15RMB收了一台路由器,师姐还给了我一根5m的网线和两根全新15m的,感觉光网线就赚翻了. ...

  8. ACM 第十二天

    博弈论(巴什博奕,威佐夫博弈,尼姆博弈,斐波那契博弈,SG函数,SG定理) 一.  巴什博奕(Bash Game): A和B一块报数,每人每次报最少1个,最多报4个,看谁先报到30.这应该是最古老的关 ...

  9. 团队作业7——第二次项目冲刺(Beta版本)-第三篇

    1.工作分工: 团队成员 分工 郭达22120 项目整合,后台代码 刘德培44060 前台界面优化 石浩洋22061 前台界面优化 曾繁钦22056 前台界面优化.测试 孙斌22030 后台代码 2. ...

  10. css滤镜让图片模糊

    .mhblur { filter: url(blur.svg#blur); /* FireFox, Chrome, Opera */ -webkit-filter: blur(53px); /* Ch ...