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