bzoj4555-求和

题目

\(S(i,j)\)表示第二类斯特林数,求:

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

分析

公式推理很简单,关键是用到了第二类斯特林数的通项公式和组合数展开的方法。

\[\begin{aligned} f(n)&=\sum _{i=0}^n\sum _{j=0}^iS(i,j)*2^j*j! \\ &=\sum _{i=0}^n\sum _{j=0}^n \frac{1}{j!}\sum _{k=0}^j (-1)^kC_j^k(j-k)^i*2^j*j! \\ &=\sum _{j=0}^n \frac{1}{j!}*2^j*j!\sum _{j=0}^n\sum _{k=0}^j (-1)^k \frac{j!}{k!(j-k)!} (j-k)^i \\ &=\sum _{j=0}^n 2^j*j!\sum _{k=0}^j\frac{(-1)^k}{k!}\sum _{i=0}^n\frac{(j-k)^i}{(j-k)!} \\ &=\sum _{j=0}^n 2^j*j!\sum _{k=0}^j\frac{(-1)^k}{k!}\frac{(j-k)^{n+1}-1}{(j-k)!(j-k-1)} \\ \end{aligned} \]

令:

\[\begin{aligned} B(x)=\frac{(-1)^x}{x!} \\ C(x)=\frac{x^{n+1}-1}{x!(x-1)} \end{aligned} \]

则有:

\[\begin{aligned} f(n)=\sum _{j=0}^n 2^j*j!\sum _{k=0}^jB(k)C(k-j) \end{aligned} \]

一个卷积的形式,直接用NTT求解即可。这里要注意的是,\(C(0)=1\),因为我们在这里定义\(0^0=1\)

代码

NTT写起来很简单,但有几个地方容易错。一定要注意把\(n\)化成整二进制的时候,\(M\)要大于\(2n\),尽管\(n\)可能本身是\(2\)的整数次幂。例如\(n=1\),这时\(M\)不能仅仅取到\(2\),而要取到\(4\)

#include<cstdio>
#include<algorithm>
#include<cctype>
using namespace std;
typedef long long giant;
const giant q=998244353;
const giant g=3;
const giant ig=332748118;
giant read() {
	giant x=0,f=1;
	char c=getchar();
	for (;!isdigit(c);c=getchar()) if (c=='-') f=-1;
	for (;isdigit(c);c=getchar()) x=x*10+c-'0';
	return x*f;
}
const giant maxn=(1<<18)+1;
const giant maxj=19;
giant a[maxn],b[maxn],c[maxn],M,xj,f[maxn],wn[maxj][2];
giant mi(giant x,giant y) {
	giant ret=1;
	while (y) {
		if (y&1) (ret*=x)%=q;
		y>>=1,(x*=x)%=q;
	}
	return ret;
}
posted @ 2017-04-17 20:23  permui  阅读(171)  评论(0编辑  收藏  举报