留待警戒

FFT的时候长度要写的和函数里一样啊XD

瞎扯

这是个第二类斯特林数的理性愉悦颓柿子题目

颓柿子真的是让我hi到不行啦(才没有)

前置芝士

一个公式

\[\sum_{i=0}^n t^i = \frac{t^{n+1}-1}{t-1}
\]

第二类斯特林数

第二类斯特林数的是指把n个对象放到m个集合里面的方案数

其递推式是

\[S_{n}^{m}=S_{n-1}^{m-1}+mS_{n-1}^{m}
\]

容斥原理的得到的通式

\[S_n^m=\frac{1}{m!}\sum_{i=0}^m(-1)^{i}C_{m}^i(m-i)^n
\]

颓柿子

题目要求求这样一个式子

\[f(n)=\sum_{i=0}^n\sum_{j=0}^iS_i^j\times2^j\times(j!)
\]

然后我们把第二类斯特林数的通式代入进去

\[f(n)=\sum_{i=0}^n\sum_{j=0}^iS_i^j\times2^j\times(j!)
\]

得到

\[f(n)=\sum_{i=0}^n\sum_{j=0}^i \frac{1}{j!}\sum_{k=0}^j(-1)^{k}C_{j}^k(j-k)^i\times2^j\times(j!)\\=\sum_{i=0}^n\sum_{j=0}^ij!\times2^j\sum_{k=0}^j\frac{(-1)^k}{k!}\times\frac{(j-k)^i}{(j-k)!}\\=\sum_{j=0}^nj!\times2^j\sum_{k=0}^{j}\frac{(-1)^k}{k!}\times\frac{\sum_{i=0}^n(j-k)^i}{(j-k)!}
\]

如果我们设\(F(i)=\frac{(-1)^k}{k!}\),\(G(i)=\frac{\sum_{i=0}^n(j-k)^i}{(j-k)!}\),则很容易就能看出一个卷积的形式,式子变形成

\[f(n)=\sum_{j=0}^nj!\times 2^j \sum_{i=0}^j F(i)\times G(j-i)
\]

FFT求后面的式子就行了

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
#define int long long
using namespace std;
const int MOD=998244353LL,G=3,invG=332748118;
int pow(int a,int b){
int ans=1;
while(b){
if(b&1)
ans=(1LL*ans*a)%MOD;
a=(1LL*a*a)%MOD;
b>>=1;
}
return (ans%MOD+MOD)%MOD;
}
void FFT(int *a,int opt,int n){
int lim=0;
while((1<<lim)<n)
lim++;
for(int i=0;i<n;i++){
int t=0;
for(int j=0;j<lim;j++)
if((i>>j)&1)
t|=(1<<(lim-j-1));
if(i<t)
swap(a[t],a[i]);
}
for(int i=2;i<=n;i<<=1){
int len=i/2;
int tmp=pow((opt)?G:invG,(MOD-1)/i);
for(int j=0;j<n;j+=i){
int arr=1;
for(int k=j;k<j+len;k++){
int t=(a[k+len]*arr)%MOD;
a[k+len]=((a[k]-t)%MOD+MOD)%MOD;
a[k]=(a[k]+t)%MOD;
arr=(arr*tmp)%MOD;
}
}
}
if(opt==0){
int invn=pow(n,MOD-2);
for(int i=0;i<n;i++)
a[i]=(a[i]*invn)%MOD;
}
}
int a[300100],b[300100],n;
int jc[300100],inv[300100];
void init(void){
jc[0]=inv[0]=1;
for(int i=1;i<=n;i++){
jc[i]=jc[i-1]*i%MOD;
inv[i]=pow(jc[i],MOD-2);
}
}
int f(int x){
return ((((x&1)?-1:1)%MOD+MOD)%MOD*(inv[x]))%MOD;
}
int g(int x){
if(x==1)
return n+1;
return ((((pow(x,n+1)-1)%MOD+MOD)%MOD)*pow(x-1+MOD,MOD-2)%MOD)*inv[x]%MOD;
}
signed main(){
scanf("%lld",&n);
// printf("n=%d\n",n);
init();
for(int i=0;i<=n;i++)
a[i]=f(i),b[i]=g(i);
// for(int i=0;i<=n;i++)
// printf("f(%lld)=%lld g(%lld)=%lld\n",i,a[i],i,b[i]);
int lx=1;
while(lx<=(n+n))
lx<<=1;
FFT(a,1,lx);
FFT(b,1,lx);
for(int i=0;i<lx;i++)
a[i]=(a[i]*b[i])%MOD;
FFT(a,0,lx);
// for(int i=0;i<=n;i++)
// printf("f*g(%lld)=%lld\n",i,a[i]);
int ans=0;
for(int i=0,j=1;i<=n;i++,j=(j+j)%MOD)
ans=(ans+j*jc[i]%MOD*a[i]%MOD)%MOD;
printf("%lld\n",ans);
return 0;
}

P4091 [HEOI2016/TJOI2016]求和的更多相关文章

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

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

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

    [题解]P4091 [HEOI2016/TJOI2016]求和 [P4091 HEOI2016/TJOI2016]求和 可以知道\(i,j\)从\(0\)开始是可以的,因为这个时候等于\(0\).这种 ...

  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]求和(第二类斯特林数+NTT)

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

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

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

  6. 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^ ...

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

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

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

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

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

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

随机推荐

  1. 51ll网产品信息保存为txt文件

    import requests from pyquery import PyQuery as pq url='http://www.51xxx.com/Try/index/p/3' headers={ ...

  2. Git简明使用教程

    猴子都能懂的GIT入门 https://backlog.com/git-tutorial/cn/git - 简易指南(这份教程挺好的) http://www.bootcss.com/p/git-gui ...

  3. 使用Hive读取ElasticSearch中的数据

    本文将介绍如何通过Hive来读取ElasticSearch中的数据,然后我们可以像操作其他正常Hive表一样,使用Hive来直接操作ElasticSearch中的数据,将极大的方便开发人员.本文使用的 ...

  4. PIVOT(透视转换)和UNPIVOT(逆透视转换)

    一.原数据状态 二.手动写透视转换1 三.手动写透视转换2 四.PIVOT(透视转换)和UNPIVOT(逆透视转换)详细使用 使用标准SQL进行透视转换和逆视转换 --行列转换 create tabl ...

  5. python 闭包和装饰器

    python 闭包和装饰器 一.闭包闭包:外部函数FunOut()里面包含一个内部函数FunIn(),并且外部函数返回内部函数的对象FunIn,内部函数存在对外部函数的变量的引用.那么这个内部函数Fu ...

  6. Lonsdor K518ISE free update news on what makes and year can work

    Lonsdor K518ISE engineers recently tested a number of cars and verified working great, below are tes ...

  7. 2017第十三届湖南省省赛B - Simplified Blackjack CSU - 1998

    在一次聚会上,Bob打算和Alice一起玩Blackjack游戏,但Alice平时很少玩扑克类游戏,Bob觉得跟Alice解释清楚Blackjack的规则有点困难,于是Bob决定和Alice玩一次简化 ...

  8. Shell生成数字序列

    转自http://kodango.com/generate-number-sequence-in-shell Shell里怎么输出指定的数字序列: for i in {1..5}; do echo $ ...

  9. js增加、删除、替换DOM对象

    当网页被加载时,浏览器会创建页面的文档对象模型DOM,即Document Object Model 整个文档为一个文档节点(document对象) 每个html元素为一个元素节点(element对象) ...

  10. Sorl搜索技术

    在一些大型门户网站.电子商务网站等都需要站内搜索功能,使用传统的数据库查询方式实现搜索无法满足一高级的搜索需求,比如:搜索速度要快.搜索结果按相关度排序.搜索内容格式不固定等,这里就需要使用全文检索技 ...