出处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. hdu2112HDU Today(floyd+map数组对字符串的应用)

    HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  2. 制作一个App的完整流程是哪些

    APP开发流程其实并不复杂,但是对于客户来说,.一般移动APP开发都离不开UI设计师.前端开发.后端开发.测试专员.产品经理等,由于他们的工作性质都不一样,我们且先把APP软件开发项目分为三个阶段: ...

  3. leetcode-零钱兑换—int溢出

     零钱兑换 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 示例 1: 输入: c ...

  4. 数据库Mysql的学习(六)-子查询和多表操作

    )*0.05 WHERE card_id ='20121xxxxxx'; //子查询就是一个嵌套先计算子查询 SELECT * FROM borrow WHERE book_id =(SELECT b ...

  5. POJ 3028 Shoot-out(概率DP)

    Description This is back in the Wild West where everybody is fighting everybody. In particular, ther ...

  6. Agri-Net(最小生成树)

    Description Farmer John has been elected mayor of his town! One of his campaign promises was to brin ...

  7. Prime Matrix(暴力出奇迹)

    Description You've got an n × m matrix. The matrix consists of integers. In one move, you can apply ...

  8. “Hello world!”团队第三周贡献分规则

    一.贡献规则制定: (1)基础分:9 , 9 , 8 , 7 , 7 , 7 , 6(按在本次编程中承担模块的重要度制定,某一模块重要度的认定通过组内开会讨论决定) (2)会议分:每人没出勤一次会议记 ...

  9. PHPCMS调取当前栏目的描述、文章位置导航、当前栏目链接、当前栏目名称

    当我们填写了栏目描述,怎么调用出来. 使用 {$CATEGORYS[$catid][description]} 就可以把栏目的描述调用出来 下面三个也比较常用{catpos($catid)} 显示文章 ...

  10. 《剑指offer》---两个栈实现队列

    本文算法使用python3实现 1.题目描述:   用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.   时间限制:1s:空间限制:32768K 2.思路描述:   ...