BZOJ4555 求和(多種解法混合版本)

2022-03-20 06:31:12 字數 2963 閱讀 6260

bzoj

給定\(n\),求

\[f(n)=\sum_^\sum_^s(i,j)\times 2^j \times (j!)

\]\(n<=100000\),結果對\(998244353\)取模。

其中\(s(i,j)\)是第二類斯特林數,表示將\(i\)個有區別的球放入\(j\)個相同的盒子中,每個盒子非空的方案數。

\(s(n,m)=s(n-1,m-1)+s(n-1,m)*m\)

邊界條件:\(s(i,0)=0,s(i,i)=1\)

第二類斯特林數考慮組合意義,可以得到另外乙個式子

\[s(n,m)=\frac\sum_^(-1)^ic_m^i(m-i)^n

\]具體的考慮方法是:先假設盒子不同,然後列舉哪些盒子為空,容斥算出所有盒子都非空的方案數,然後除掉盒子不同產生的多餘的貢獻。

將組合數拆開,我們得到

\[s(n,m)=\frac\sum_^(-1)^i\frac(m-i)^n

\]\[s(n,m)=\sum_^\frac\frac

\]這很明顯是乙個卷積的形式,因此,我們可以利用\(fft/ntt\)在\(o(nlogn)\)的時間內預處理所有的\(s(n,i),i\in[0,n]\)

\[f(n)=\sum_^n\sum_^ns(i,j)2^jj!

\]將第二類斯特林數展開為卷積的形式

\[=\sum_^n\sum_^nj!·2^j(\frac\sum_^j(-1)^k·c_j^k·(j-k)^i)

\]\[\sum_^n2^j\sum_^j(-1)^k·c_j^k·\sum_^n(j-k)^i

\]\[\sum_^n2^j·j!\sum_^j\frac\frac^n(j-k)^i}

\]\[\sum_^n2^j·j!\sum_^j\frac\frac-1}

\]不難觀察到後半部分是卷積的形式,\(ntt\)預處理即可。

時間複雜度\(o(nlogn)\)

定義\(bell\)數\(b(n)=\sum_^s(n,i)\)。表示\(i\)個不同的球分成任意個非空集合的方案數。

我們可以得到式子

\[b(n)=\sum_^c_^ib(i)

\]證明:考慮組合意義,列舉與\(1\)號球在不同集合內的個數,相當於劃分為了子問題處理。

設\(s^(n,i)=s(n,i)i\ !\),表示集合不相同的第二類斯特林數。同理定義\(b^(n)\)

\[b^(n)=\sum_^c_n^ib^(n-i)

\]證明:集合之間已經沒有關係了,列舉第乙個集合中的元素個數,其他的相當於劃分為了子問題處理。

設題目所求

\[\sum_^\sum_^s(i,j)\times 2^j \times (j!)=\sum_^nf(i)

\]\[f(n)=\sum_^s(i,j)j\ !2^j

\]前面部分相當於\(b'(n)\),後面部分可以看做每乙個集合有兩種顏色,每次在一種顏色中放球。

那麼,類似於前面的\(s',b'\)我們可以寫出

\[f(n)=2\sum_^nc_n^if(n-i)

\]即考慮第乙個集合中的元素個數,以及當前集合的顏色。

將組合數拆開考慮,得到。

\[f(n)=2n!\sum_^\frac\frac

\]將式子稍微改寫一下

\[\frac=\sum_^\frac\frac

\]設\(g(i)=\frac\)。可以使用\(cdq\)分治+\(fft\)來實現。

我們觀察到如果要算出\(f(n)\),\(f(1..n-1)\)就必須求得,於是,我們進行分治,每次左側的\(f\)值可以對右側的值產生貢獻,貢獻就是\(f(i)\)和\(g(i)\)的卷積。這就是乙個\(cdq\)分治,時間複雜度\(o(nlog^2n)\)

\[\frac=\sum_^\frac\frac

\]設\(f(x)\)是\(f(n)\)的\(egf\),\(g(n)\)是\(g(i)=\frac\)的\(oeg\),特別注意的是,\(g(0)=0\)

所以我們有\(f(x)=f(x)g(x)+1\)。需要\(+1\)的原因是\(g(0)=0,f(0)=1\)。於是我們解一下方程

\[f(x)=\frac

\]多項式求逆即可。

時間複雜度\(o(nlogn)\)

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define ll long long

#define rg register

#define mod 998244353

#define max 500000

const int pr=3;

const int phi=mod-1;

int fpow(int a,int b)

return s;

}int r[max],n,m,l;

int jc[max],inv[max];

int a[max],b[max],s[max];

void ntt(int *p,int opt)

int fpow(int a,int b)

return s;

}int jc[max],inv[max],jv[max],n;

int f[max],g[max];

void prepare(int n)

int r[max];

void ntt(int *p,int len,int opt)

int fpow(int a,int b)

return s;

}int inv[max],jc[max],n;

int f[max],g[max];

void prepare(int n)

int r[max],w[max];

void ntt(int *p,int len,int opt)

int main()

bzoj 4555 求和 線性篩 生成函式

題目傳送門 傳送門題目大意 大家應該都知道 begin f n sum sum genfrac 0 j 2 j sum sum genfrac 0 j 2 j sum sum sum k i binom 1 2 j sum sum binom 1 2 j sum k i end 設 s k n su...

bzoj4555 數學推導 畫柿子 NTT)

題面 今天學了多項式逆元,找到了這題。但是本蒟蒻覺得這題和逆元並沒有什麼關係,和逆元有關的題解也看不懂。題目要你求這樣乙個函式,結果對乙個費馬素數取模。s i,j 為第二類斯特林數,題目還惡意地給出了遞推公式。含義是將n個不同的元素拆分成m個集合的方案數,顯然當m n時,s n,m 0。所以原式首先...

BZOJ 2901 矩陣求和

bzoj 2901 矩陣求和 字首和 給出兩個n n的矩陣,m次詢問它們的積中給定子矩陣的數值和。第一行兩個正整數n,m。接下來n行,每行n個非負整數,表示第乙個矩陣。接下來n行,每行n個非負整數,表示第二個矩陣。接下來m行,每行四個正整數a,b,c,d,表示詢問第乙個矩陣與第二個矩陣的積中,以第a...