【题解】P4091 [HEOI2016/TJOI2016]求和

[P4091 HEOI2016/TJOI2016]求和

可以知道\(i,j\)从\(0\)开始是可以的,因为这个时候等于\(0\)。这种题目都要从\(0\)开始或许比较好(Itst语)

然后就开始化式子吧

原式=

\[\sum_{i=0}^{n} \sum_{j=0}^n {i \brace j}2^j j!
\]

斯特林容斥式子展开一下,并且我们知道当\(k>j\)时,\({j \choose k}=0\),所以扩大枚举范围到\(n\)

\[\sum_{i=0}^n\sum_{j=0}^n j!\sum_{k=0}^n \dfrac 1 {j!}(-1)^k{j \choose k}(j-k)^i
\]

只有一项和\(i\)有关,约掉一些东西

\[\sum_{j=0}^n\sum_{k=0}^j (-1)^k{j \choose k}\sum_{i=0}^n(j-k)^i
\]

等比求和(边界情况到时候再考虑)

\[\sum_{j=0}^n \sum_{k=0}^j (-1)^k{j \choose k}\dfrac {1-(j-k)^{n+1}} {1-(j-k)}
\]

拆掉组合数

\[\sum_{j=0}^n j! \sum_{k=0}^j \dfrac{(-1)^k} {k!}\dfrac {1-(j-k)^{n+1}} {1-(j-k)}
\]

就是一个\(NTT\)的式子,\(NTT\)处理就好了。

这题关键就是想到那个...算了没什么关键的,无非就是记得几个公式。

其实关键的就是记得把枚举下标最好扩展到一起,来消除变量之间的相互联系,并且方便预处理。

考虑一些边界:

\(j-k=0\)的时候,此时\(j=k\),代回到最开始发现要\(=1\),或者说一般组合题里面认为\(0^0=1\)

\(j-k=1\)的时候,这个时候简单一点,就是等比数列不能用公式的情况,直接\(=n+1\)即可。

//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; typedef long long ll;
inline int qr(){
register int ret=0,f=0;
register char c=getchar();
while(c<48||c>57)f|=c==45,c=getchar();
while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
return f?-ret:ret;
} namespace poly{
const int maxn=1<<21|1;
int r[maxn];
int savlen;
inline void getr(const int&len){
if(len==savlen) return;
int cnt=0;
for(register int t=1;t<len;t<<=1)++cnt;
for(register int t=1;t<len;++t)
r[t]=r[t>>1]>>1|(t&1)<<cnt>>1;
}
const int mod=998244353;
const int g=3;
const int gi=332748118;
inline int ksm(const int&base,const int&p){
register int ret=1;
for(register int t=p,b=base%mod;t;t>>=1,b=1ll*b*b%mod)
if(t&1) ret=1ll*ret*b%mod;
return ret;
}
inline void NTT(int*a,const int&len,const int&tag){
getr(len);
for(register int t=1;t<len;++t)
if(r[t]>t) swap(a[t],a[r[t]]);
int *a0,*a1,s=g;
if(tag!=1) s=gi;
for(register int t=1,wn;t<len;t<<=1){
wn=ksm(s,(mod-1)/(t<<1));
for(register int i=0;i<len;i+=t<<1){
a1=(a0=a+i)+t;
for(register int k=0,m,w=1;k<t;++k,++a1,++a0,w=1ll*w*wn%mod){
m=1ll*w**a1%mod;
*a1=(*a0+mod-m)%mod;
*a0=(*a0+m)%mod;
}
}
}
if(tag!=1)
for(register int t=0,w=ksm(len,mod-2);t<len;++t)
a[t]=1ll*a[t]*w%mod;
}
} using namespace poly;
int jc[100005],inv[100005],bin[100005],n; inline void pre(){
bin[0]=jc[0]=inv[0]=1;
for(register int t=1;t<=100000;++t)
jc[t]=1ll*jc[t-1]*t%mod;
inv[100000]=ksm(jc[100000],mod-2);
for(register int t=100000-1;t;--t)
inv[t]=1ll*(t+1)*inv[t+1]%mod;
for(register int t=1;t<=100000;++t)
bin[t]=(bin[t-1]<<1)%mod; } int a[maxn],b[maxn];
int main(){
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
#endif
pre();
n=qr();
for(register int t=0;t<=n;++t){
a[t]=inv[t];
if(t&1) a[t]=mod-a[t];
b[t]=1ll*(ksm(t,n+1)-1ll+mod)%mod*ksm(t-1,mod-2)%mod*inv[t]%mod;
}
b[0]=1;b[1]=n+1;
int k=1;
while(k<=n)k<<=1;
NTT(a,k<<1,1);NTT(b,k<<1,1);
for(register int t=0;t<k<<1;++t) a[t]=1ll*a[t]*b[t]%mod;
NTT(a,k<<1,-1);
int ans=0;
for(register int t=0;t<=n;++t)
ans=(ans+1ll*bin[t]*jc[t]%mod*a[t]%mod)%mod;
cout<<ans<<endl;
return 0;
}

【题解】P4091 [HEOI2016/TJOI2016]求和的更多相关文章

  1. 洛谷 P4091 [HEOI2016/TJOI2016]求和 解题报告

    P4091 [HEOI2016/TJOI2016]求和 题目描述 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: \[ f(n)=\sum_{i=0}^n\ ...

  2. 【题解】Luogu P4091 [HEOI2016/TJOI2016]求和

    原题传送门 \[\begin{aligned} a n s &=\sum_{i=0}^{n} \sum_{j=0}^{i}\left\{\begin{array}{c}{i} \\ {j}\e ...

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

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

  4. [洛谷P4091][HEOI2016/TJOI2016]求和

    题目大意:给你$n(n\leqslant10^5)$,求:$$\sum\limits_{i=0}^n\sum\limits_{j=0}^i\begin{Bmatrix}i\\j\end{Bmatrix ...

  5. P4091 [HEOI2016/TJOI2016]求和(第二类斯特林数+NTT)

    传送门 首先,因为在\(j>i\)的时候有\(S(i,j)=0\),所以原式可以写成\[Ans=\sum_{i=0}^n\sum_{j=0}^nS(i,j)\times 2^j\times j! ...

  6. [题解] LuoguP4091 [HEOI2016/TJOI2016]求和

    传送门 首先我们来看一下怎么求\(S(m,n)\). 注意到第二类斯特林数的组合意义就是将\(m\)个不同的物品放到\(n\)个没有区别的盒子里,不允许有空盒子的方案数. 那么将\(m\)个不同的物品 ...

  7. luogu P4091 [HEOI2016/TJOI2016]求和

    传送门 这一类题都要考虑推式子 首先,原式为\[f(n)=\sum_{i=0}^{n}\sum_{j=0}^{i}S(i,j)*2^j*j!\] 可以看成\[f(n)=\sum_{j=0}^{n}2^ ...

  8. P4091 [HEOI2016/TJOI2016]求和

    留待警戒 FFT的时候长度要写的和函数里一样啊XD 瞎扯 这是个第二类斯特林数的理性愉悦颓柿子题目 颓柿子真的是让我hi到不行啦(才没有) 前置芝士 一个公式 \[ \sum_{i=0}^n t^i ...

  9. 【LG4091】[HEOI2016/TJOI2016]求和

    [LG4091][HEOI2016/TJOI2016]求和 题面 要你求: \[ \sum_{i=0}^n\sum_{j=0}^iS(i,j)*2^j*j! \] 其中\(S\)表示第二类斯特林数,\ ...

随机推荐

  1. 阿里开源!轻量级深度学习端侧推理引擎 MNN

    阿里妹导读:近日,阿里正式开源轻量级深度学习端侧推理引擎“MNN”. AI科学家贾扬清如此评价道:“与 Tensorflow.Caffe2 等同时覆盖训练和推理的通用框架相比,MNN 更注重在推理时的 ...

  2. React事件用法

    一.事件处理函数的使用 1.1 绑定事件处理函数 1.2 使用 <HelloWorld onClick={this.handleClick}/> 大括号中指定的是this对象即当前组件引用 ...

  3. 图表echarts折线图,柱状图,饼状图

    总体就是有折线图相关图标的设置,x,y轴的设置,x,y轴或者数据加上单位的设置.饼状图如何默认显示几个数据中的某个数据 折线图:legend(小标题)中间默认是圆圈 改变成直线 在legend设置的时 ...

  4. springboot 实现 aop

    pom.xml 导入 springboot aop 依赖 <dependency> <groupId>org.springframework.boot</groupId& ...

  5. 浅谈集合框架五——集合框架扩展:Collections工具类的使用,自定义比较器

    最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出.初学者对于本篇博客只建议作为参考,欢迎留言共同学习. 之前有介绍集合框架的体系 ...

  6. 【mac】关于mac的一些命令

    一. 如何查看自己的文件大小,所有文件占了多少? du -h -d 1 .        当前目录文件以及大小 sudo  du -h -d 1 /    所目录下的文件以及大小

  7. HDU 1540 Tunnel Warfare (线段树)

    Tunnel Warfare Problem Description During the War of Resistance Against Japan, tunnel warfare was ca ...

  8. 为什么阿里代码规约要求避免使用 Apache BeanUtils 进行属性复制

    缘起 有一次开发过程中,刚好看到小伙伴在调用 set 方法,将数据库中查询出来的 Po 对象的属性拷贝到 Vo 对象中,类似这样: 可以看出,Po 和 Vo 两个类的字段绝大部分是一样的,我们一个个地 ...

  9. H3C FTP双TCP连接方式

  10. vue 使用webpack打包后路径报错以及 alias 的使用

    一.vue 使用webpack打包后路径报错(两步解决) 1. config文件夹 ==> index.js ==> 把assetsPublicPath的 '/ '改为 './' 2. b ...