https://www.zybuluo.com/ysner/note/1288083

题面

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

  • \(n\leq10^5\)

    解析

    觉得这道题目与[bzoj5093]图的价值相比,还是小巫见大巫呢。
    公式复杂程度和代码细节量少了不止一个级别。。。

首先,要求的时间复杂度是\(O(nlogn)\)。
则我们需要卷积形式的,第二类斯特林数的,通项公式:(推导过程在链接的那篇博文里)
\[S(i,j)=\sum_{k=0}^j\frac{(-1)^k}{k!}\frac{(j-k)^i}{(j-k)!}\]
然后推推式子:
\[=\sum_{i=0}^n\sum_{j=0}^iS(i,j)*2^j*j!\]
注意到\(i<j\)时,\(S(i,j)=0\),我们可以扩大\(j\)的范围:
\[=\sum_{j=0}^n2^j*j!\sum_{i=0}^nS(i,j)\]

所以题目实际上要求我们把\(\sum_{i=0}^nS(i,j)\)化成卷积形式。
\[\sum_{i=0}^nS(i,j)=\sum_{i=0}^n\sum_{k=0}^j\frac{(-1)^k}{k!}\frac{(j-k)^i}{(j-k)!}\]
\[=\sum_{k=0}^j\frac{(-1)^k}{k!(j-k)!}\sum_{i=0}^n(j-k)^i\]
又根据等比数列求和公式\[\sum_{i=0}^n(j-k)^i=\frac{(j-k)^{n+1}-1}{(j-k)-1}\]
最终式子化为
\[=\sum_{k=0}^n\frac{(-1)^k}{k!}\frac{(j-k)^{n+1}-1}{[(j-k)-1](j-k)!}\]
显然\(NTT\)轻松解决。

ps:如何快速求阶乘的逆元

显然一般方法是一边求阶乘一边求逆元,复杂度\(O(nlogn)\)。
然而更好的方法是求完阶乘后,求出最后一个阶乘的逆元,再不断\(inv[i]=inv[i+1]*(i+1)\)即可。
时间复杂度\(O(n)\)

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define ll long long
#define re register
#define il inline
#define fp(i,a,b) for(re int i=a;i<=b;i++)
#define fq(i,a,b) for(re int i=a;i>=b;i--)
using namespace std;
const int N=4e5+1,mod=998244353;
int n,m,lim=1,l,r[N],a[N],b[N],jc[N],inv[N],ans;
il int ksm(re int S,re int n)
{re int T=S;S=1;while(n){if(n&1) S=1ll*S*T%mod;T=1ll*T*T%mod;n>>=1;}return S;
}
il void NTT(re int *A,re int tp)
{fp(i,1,lim-1) if(i<r[i]) swap(A[i],A[r[i]]);for(re int mid=1;mid<lim;mid<<=1){re int gu=mid<<1,W=ksm(3,(mod-1)/gu);if(tp==-1) W=ksm(W,mod-2);for(re int j=0;j<lim;j+=gu){re int w=1;for(re int k=0;k<mid;k++,w=1ll*w*W%mod){re ll x=A[j+k],y=1ll*w*A[j+mid+k]%mod;A[j+k]=(x+y)%mod;A[j+mid+k]=(x-y+mod)%mod;}}}
}
il int gi()
{re int x=0,t=1;re char ch=getchar();while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();if(ch=='-') t=-1,ch=getchar();while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();return x*t;
}
int main()
{n=m=gi();jc[0]=inv[0]=1;fp(i,1,n) jc[i]=1ll*jc[i-1]*i%mod;inv[n]=ksm(jc[n],mod-2);fq(i,n-1,1) inv[i]=1ll*inv[i+1]*(i+1)%mod;b[0]=1;b[1]=n+1;fp(i,0,n){a[i]=(i&1)?mod-inv[i]:inv[i];if(i>1) b[i]=1ll*(ksm(i,n+1)-1+mod)%mod*ksm(i-1,mod-2)%mod*inv[i]%mod;}while(lim<=n+m) lim<<=1,++l;fp(i,1,lim-1) r[i]=(r[i>>1]>>1)|((i&1)<<l-1);NTT(a,1);NTT(b,1);fp(i,0,lim-1) a[i]=1ll*a[i]*b[i]%mod;NTT(a,-1);re ll Inv=ksm(lim,mod-2);for(re int i=0,j=1;i<=n;++i,j=((ll)j<<1)%mod)(ans+=1ll*a[i]*Inv%mod*jc[i]%mod*j%mod)%=mod;printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/yanshannan/p/9678526.html

[HEOI2016/TJOI2016]求和相关推荐

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

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

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

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

  3. BZOJ4555[HEOI2016/TJOI2016]求和

    题目链接 洛谷 BZOJ 前置知识 第二类斯特林数 含义 \(S_n^m\)表示将\(n\)个互不相同的元素划分为\(m\)个非空集合的方案数 递推式 \[ S_n^m = S_{n - 1}^{m ...

  4. 洛谷 P4091 [HEOI2016/TJOI2016]求和 任意模数fft

    题目描述 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: f(n)=∑ni=0∑ij=0S(i,j)×2j×(j!) f ( n ) = ∑ i = 0 n ...

  5. loj2058 「TJOI / HEOI2016」求和 NTT

    loj2058 「TJOI / HEOI2016」求和 NTT 链接 loj 思路 \[S(i,j)=\frac{1}{j!}\sum\limits_{k=0}^{j}(-1)^{k}C_{j}^{k ...

  6. 【TJOJI\HEOI2016】求和

    [TJOI/HEOI2016]求和 这题好难啊!! 斯特林数+NTT. 首先我们将第二类斯特林数用容斥展开,具体原理不解释了. \(\displaystyle S(i,j)=\frac{1}{j!}\ ...

  7. P2825 [HEOI2016/TJOI2016]游戏

    题目描述 详见  P2825 [HEOI2016/TJOI2016]游戏. solution 套路题. 一般思路是行列建点跑二分图最大匹配. 此题中的#会分隔行列,因此我们把每行的极大联通块设为点,列 ...

  8. 【TJOI/HEOI2016】求和

    题面 题目分析 \[ \begin{split} \sum_{i=0}^n\sum_{j=0}^iS(i,j)\cdot 2^j\cdot j!&=\sum_{j=0}^n2^j\cdot j ...

  9. 主席树 + 后缀数组求LCP + 二分套二分 ---- P4094 [HEOI2016/TJOI2016]字符串

    题目链接 题目大意: 解题思路: 设我们的答案为midmidmid(注意这里有坑是[a,b][a,b][a,b]的所有子串和[c,d][c,d][c,d]这个子串的最长lcplcplcp),那么我们会 ...

最新文章

  1. 图片和文件上传的两款插件
  2. AngularJs $resource 高大上的数据交互
  3. 子组件跟随父组件re-render
  4. NLP jieba分词源码解析
  5. timedatectl使用
  6. 基于JWT的API权限校验:需求分析
  7. 关于停断电后电脑自动开机重启的问题
  8. 图卷积神经网络(part4)--GNN
  9. 街舞中的rolling机器人_REMEMBER街舞培训中心2020年元旦汇演
  10. linux文件删除恢复
  11. Mysql在sql中截取时间类型字段的年月日和时间-DATE_FORMAT() 函数
  12. Jarvis Oj Pwn 学习笔记-level0
  13. SQL 删除重复数据,重复数据只保留ID最小的行
  14. php openssl 处理pkcs8,【转载】OpenSSL命令---pkcs8
  15. 流媒体播放器VLC media player
  16. python 画图 实时_Python matplotlib实时画图案例
  17. Android x86的arm兼容库移植--初步分析及尝试手动移植houdini/ndk_translation
  18. linux系统怎么设置ftp账号密码错误,linux系统FTP设置账号密码
  19. 1.2 cuda相关常见错误记录(不断更新)
  20. 入侵必读:网警如何找到你

热门文章

  1. C++Primer Plus (第六版)阅读笔记 + 源码分析【第四章:复合类型】
  2. 二叉树的基本概念以及基本操作
  3. Oracle 用子查询创建表
  4. 【转】 Ubuntu 11.04 下安装配置 JDK 7
  5. python退出帮助系统help应该使用exit_Python终极教程(Windows)
  6. P1744 采购特价商品(SPFA求最短路径模板)
  7. java class修改_【原创】Java基础之简单修改jar包中的class
  8. 【实验】不会部署VRRP?看完就会了
  9. 云原生时代下,容器安全的“四个挑战”和“两个关键”
  10. vs中imshow函数报错_Win7下VS2010中配置Opencv2.4.4的方法(32位和64位都有效)(亲测成功)...