题目大意

给定\(S(n,m)\)表示第二类斯特林数,定义函数\(f(n)\)

\[f(n) = \sum_{i=0}^n\sum_{j=0}^iS(i,j)*2^j*(j!)
\]

给定正整数\(n,(n\leq 10^5)\),求\(f(n)\)

题解

我们都知道第二类斯特林数的递推公式为

\[S(i,j) = S(i-1,j-1) + j*S(i-1,j),(1 \leq j \leq i-1)
\]

且有边界\(S(i,i) = 1(0 \leq i),S(i,0) = 0(1 \leq i)\)

第二类斯特林数\(S(i,j)\)的含义是把\(i\)个元素划分成\(j\)个无序的集合的方案

假设允许空集合的存在的话,方案即为\(m^n\)

我们应用容斥原理,枚举至少有多少空集合空集合,那么有

\[S(n,m) = \frac{1}{m!}\sum_{k=1}^{m}C_m^k(m-k)^n(-1)^k
\]

设\(g(n) = \sum_{i=0}^nS(n,i)2^i(i!)\)

那么我们将\(S(n,m)\)代入\(g(n)\)化简得

\[g(n) = \sum_{m=0}^n2^m(m!)\sum_{k=0}^m\frac{(-1)^k}{k!}\frac{(m-k)^n}{(m-k)!}
\]

那么将\(g(n)\)带入答案表达式中,有

\[ans = \sum_{n=0}^x\sum_{m=0}^n2^m(m!)\sum_{k=0}^m\frac{(-1)^k}{k!}\frac{(m-k)^n}{(m-k)!}
\]

这时我们发现每次最外层的\(n -> (n+1)\)时,都相当于在内部的\(\frac{(m-k)^n}{(m-k)!}\)一项上又加上了一个\(\frac{(m-k)^{n+1}}{(m-k)!}\)

所以我们把这一项做等比数列求和.

设\(g(x) = \frac{x^{n+1} - x}{(x-1)(x!)}\)

那么上式变成了

\[ans = \sum_{m=0}^n2^m(m!)\sum_{k=0}^m\frac{(-1)^k}{k!}g(m-k)
\]

于是我们在\(\sum_{k=0}^m\frac{(-1)^k}{k!}g(m-k)\)进行FFT计算卷积

这样就只剩下了一个sigma式,for循环一边即可.

复杂度\(O(nlogn)\)

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
template<typename T>inline void read(T &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
const int maxn = 600010;
const int mod = 998244353;
const int pri_rt = 3;
int w[maxn];
inline int qpow(int x,int p){
int ret = 1;
for(;p;p>>=1,x=1LL*x*x%mod) if(p&1) ret=1LL*ret*x % mod;
return ret;
}
inline void FNT(int *x,int n,int p){
for(int i=0,t=0;i<n;++i){
if(i > t) swap(x[i],x[t]);
for(int j=n>>1;(t^=j)<j;j>>=1);
}
for(int m=2;m<=n;m<<=1){
int k = m>>1;
int wn = qpow(pri_rt,p == 1 ? (mod-1)/m : (mod-1) - (mod-1)/m);
for(int i=1;i<k;++i) w[i] = 1LL*w[i-1]*wn % mod;
w[0] = 1;
for(int i=0;i<n;i+=m){
for(int j=0;j<k;++j){
int u = 1LL*x[i+j+k]*w[j] % mod;
x[i+j+k] = x[i+j] - u;
if(x[i+j+k] < 0) x[i+j+k] += mod;
x[i+j] += u;
if(x[i+j] >= mod) x[i+j] -= mod;
}
}
}
if(p == -1){
int inv = qpow(n,mod-2);
for(int i=0;i<n;++i) x[i] = 1LL*x[i]*inv % mod;
}
}
int fac[maxn],inv[maxn];
inline void init(int n){
fac[0] = 1;
for(int i=1;i<=n;++i) fac[i] = 1LL*fac[i-1]*i % mod;
inv[n] = qpow(fac[n],mod-2);
for(int i = n-1;i>=0;--i) inv[i] = 1LL*inv[i+1]*(i+1) % mod;
}
int A[maxn],B[maxn];
int main(){
int n;read(n);
int len;for(len=1;len <= (n+1);len<<=1);len<<=1;
init(n);
for(int i=0;i<=n;++i){
if(i&1) A[i] = -inv[i] + mod;
else A[i] = inv[i];
}
for(int i=2;i<=n;++i){
B[i] = qpow(i,n+1) - i + mod;
if(B[i] < 0) B[i] += mod;
B[i] = (1LL*B[i]*qpow(i-1,mod-2)%mod*inv[i]) % mod;
}B[1] = n;
FNT(A,len,1);FNT(B,len,1);
for(int i=0;i<len;++i) A[i] = 1LL*A[i]*B[i] % mod;
FNT(A,len,-1);
int ans = 1;
for(int i=1,f2=2;i<=n;++i){
ans = (ans + 1LL*A[i]*f2%mod*fac[i]) % mod;
f2 = (f2<<1) % mod;
}printf("%d\n",ans);
getchar();getchar();
return 0;
}

bzoj4555: 求和sum 快速傅立叶变换的更多相关文章

  1. 离散傅立叶变换与快速傅立叶变换(DFT与FFT)

    自从去年下半年接触三维重构以来,听得最多的词就是傅立叶变换,后来了解到这个变换在图像处理里面也是重点中的重点. 本身自己基于高数知识的理解是傅立叶变换是将一个函数变为一堆正余弦函数的和的变换.而图像处 ...

  2. $\mathcal{FFT}$·$\mathcal{Fast \ \ Fourier \ \ Transformation}$快速傅立叶变换

    \(2019.2.18upd:\) \(LINK\) 之前写的比较适合未接触FFT的人阅读--但是有几个地方出了错,大家可以找一下233 啊-本来觉得这是个比较良心的算法没想到这么抽搐这个算法真是将一 ...

  3. 快速傅立叶变换(FFT)

    多项式 系数表示法 设\(f(x)\)为一个\(n-1\)次多项式,则 \(f(x)=\sum\limits_{i=0}^{n-1}a_i*x_i\) 其中\(a_i\)为\(f(x)\)的系数,用这 ...

  4. BZOJ 2194 快速傅立叶变换之二 | FFT

    BZOJ 2194 快速傅立叶变换之二 题意 给出两个长为\(n\)的数组\(a\)和\(b\),\(c_k = \sum_{i = k}^{n - 1} a[i] * b[i - k]\). 题解 ...

  5. 为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换

    写在最前面:本文是我阅读了多篇相关文章后对它们进行分析重组整合而得,绝大部分内容非我所原创.在此向多位原创作者致敬!!!一.傅立叶变换的由来关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶 ...

  6. 快速傅立叶变换(FFT)算法

    已知多项式f(x)=a0+a1x+a2x2+...+am-1xm-1, g(x)=b0+b1x+b2x2+...+bn-1xn-1.利用卷积的蛮力算法,得到h(x)=f(x)g(x),这一过程的时间复 ...

  7. NVIDIA GPU的快速傅立叶变换

    NVIDIA GPU的快速傅立叶变换 cuFFT库提供GPU加速的FFT实现,其执行速度比仅CPU的替代方案快10倍.cuFFT用于构建跨学科的商业和研究应用程序,例如深度学习,计算机视觉,计算物理, ...

  8. 傅立叶变换系列(五)快速傅立叶变换(FFT)

    说明: 傅里叶级数.傅里叶变换.离散傅里叶变换.短时傅里叶变换...这些理解和应用都非常难,网上的文章有两个极端:“Esay”  Or  “Boring”!如果单独看一两篇文章就弄懂傅里叶,那说明你真 ...

  9. [快速傅立叶变换&快速傅里叶变换]【旧 手写笔记】

    $FFT$好美啊 参考资料: 1.算法导论 2.Miskcoo 3.Menci 4.虚数的意义-阮一峰 简单说一下,具体在下面的图片 实现: 可以用$complex$也可以手写 和计算几何差不多 注意 ...

随机推荐

  1. 最短路 uva12661 Funny Car Racing

    传送门:点击打开链接 题意:给你有向图,每条边呈周期性开放,即开放a时间,再关闭b时间.再开放a时间以此类推 假设时间不足以穿过这条路则不能走.你能够在节点等待时间,问从s走到t所须要的最小时间 细致 ...

  2. java 获取微信 页面授权 获取用户openid

    先调用微信的地址 跳转https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx4b4009c4fce00e0c&redirect ...

  3. 用汇编的角度剖析c++的virtual

    多态是c++的关键技术,背后的机制就是有一个虚函数表,那么这个虚函数表是如何存在的,又是如何工作的呢? 当然不用的编译器会有不同的实现机制,本文只剖析vs2015的实现. 单串继承 首先看一段简单的代 ...

  4. 讲真,你是因为什么才买华为P20系列手机!

    华为P20系列手机上市两个半月发货600万台!600万台?!看到这个亮瞎我钛合金狗眼的数据,且容我掰着手指脚趾算一下,算了,还是容我毫不夸张的感叹一句吧:华为做手机不用桨,不需风,全靠“浪”……. 两 ...

  5. 09-redis事务及锁应用

    Redis 中的事务 Redis支持简单的事务 Redis与 mysql事务的对比 ------------------------------------------------------- My ...

  6. OpenCV 入门示例之三:AVI 视频播放控制

    前言 在前文中给出了一个非常简短的视频播放程序,但它没有实现常规视频播放器中的播放滚动条功能,本文对此视频播放器程序加以改进,实现此功能. 滚动条的实现思路 滚动条的功能实质上就是从一帧跳跃到另外一帧 ...

  7. EF获取DbContext中已注册的所有实体类型

    /// <summary> /// 获取DbContext中已注册的实体类型 /// </summary> /// <typeparam name="T&quo ...

  8. 初探swift语言的学习笔记四-2(对上一节有些遗留进行处理)

    作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/30314359 转载请注明出处 假设认为文章对你有所帮助,请通过留言 ...

  9. wmiprvse.exe 进程占CPU过高 问题解决

    wmiprvse.exe是一个系统服务的进程,你可以结束任务,进程自然消失. 禁用Windows Management Instrumentation Driver Extensions服务或者改为手 ...

  10. 【BZOJ4710】[Jsoi2011]分特产 组合数+容斥

    [BZOJ4710][Jsoi2011]分特产 Description JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同 ...