【题解】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. 20-1 django上传文件和项目里上传头像如何查看

    一 普通上传方式 1 views def upload(request): if request.method == "POST": # print(request.POST) # ...

  2. Hive高阶聚合函数 GROUPING SETS、Cube、Rollup

    -- GROUPING SETS作为GROUP BY的子句,允许开发人员在GROUP BY语句后面指定多个统计选项,可以简单理解为多条group by语句通过union all把查询结果聚合起来结合起 ...

  3. java的System.currentTimeMillis()如何转换成C#的DateTime.Now.Ticks?

    考虑到我们是东八时区的话,应做如下转换: long milli = System.currentTimeMillis() + 8*3600*1000; long ticks = (milli*1000 ...

  4. Oracle的dual是什么东西啊

    原文:https://zhidao.baidu.com/question/170487574.html?fr=iks&word=dual&ie=gbk Oracle的dual是什么东西 ...

  5. TabHost选项卡的实现(一):使用TabActivity实现

    一. TabHost的基本开发流程 TabHost是一种非常实用的组件,可以很方便的在窗口上防止多个标签页,每个标签页相当于获得了一个外部容器相同大小的组件摆放区域. 我们熟悉的手机电话系统" ...

  6. Codeforces Round #176 (Div. 1 + Div. 2)

    A. IQ Test 模拟. B. Pipeline 贪心. C. Lucky Permutation 每4个数构成一个循环. 当n为偶数时,n=4k有解:当n为奇数时,n=4k+1有解. D. Sh ...

  7. webpack学习(一)项目中安装webpack

    如何在项目中安装webpack,webpack-cli? 前提:电脑安装了 node和npm包管理工具 1 创建项目文件夹或者在已有的项目中打开终端  输入相关命令: npm init 因为已经安装好 ...

  8. Python--day40--主线程和子线程代码讲解

    1,最简单的线程例子: 2,多线程并发: import time from threading import Thread #多线程并发 def func(n): time.sleep(1) prin ...

  9. Codeforces Round #529 (Div. 3) E. Almost Regular Bracket Sequence(思维)

    传送门 题意: 给你一个只包含 '(' 和 ')' 的长度为 n 字符序列s: 给出一个操作:将第 i 个位置的字符反转('(' ')' 互换): 问有多少位置反转后,可以使得字符串 s 变为&quo ...

  10. HDU 1540 Tunnel Warfare (线段树)

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