題面
今天學了多項式逆元,找到了這題。但是本蒟蒻覺得這題和逆元並沒有什麼關係,和逆元有關的題解也看不懂。。。
題目要你求這樣乙個函式,結果對乙個費馬素數取模。
s(i,j)為第二類斯特林數,題目還惡意地給出了遞推公式。。。
含義是將n個不同的元素拆分成m個集合的方案數,顯然當m>n時,s(n,m)=0。
所以原式首先可以寫成 an
s=∑i
=0n∑
j=0n
∗2j∗
(j!)
∗s(i
,j)
然後代第二類斯特林數的公式 an
s=∑i
=0n∑
j=0n
∗2j∗
∑k=0
j(−1
)k∗c
(j,k
)∗(j
−k)i
接著把組合數也代進去 an
s=∑i
=0n∑
j=0n
∗2j∗
∑k=0
j(−1
)k∗j
!k!∗
(j−k
)!∗(
j−k)
i an
s=∑i
=0n∑
j=0n
∗2j∗
(j!)
∑k=0
j(−1
)kk!
∗(j−
k)i(
j−k)
! 這個最內層的求和已經是乙個卷積了,但是最外層還有個礙眼的i,難道要做n次卷積嗎?
整條式子只有(j
−k)i
裡面有i,根據乘法分配律或者畫柿子的套路,把i的列舉扔到最內層就可以了。an
s=∑j
=0n2
j∗(j
!)∑k
=0j(
−1)k
k!∗∑
ni=0
(j−k
)i(j
−k)!
這樣看起來就很舒服,預處理階乘和階乘逆元,等比數列求和,然後上ntt就可以了。(998244353的原根是3)。
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define mmst(a, b) memset(a, b, sizeof(a))
#define mmcp(a, b) memcpy(a, b, sizeof(b))
typedef long long ll;
const int n=(1
<<18)+5;
const ll p=998244353,g=3;
ll cheng(ll a,ll b)
int n,rev[n];
void init(int lim)}}
if(!ops)
}ll nn,ans,er[n],jc[n],a[n],b[n];
int main()
BZOJ4555 求和(多種解法混合版本)
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,...
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...
BZOJ2326 數學作業
題目傳送門 設n的答案為f n 那麼很容易得到乙個遞推式 f n f n 1 10k n,其中k是n的位數。所以當k固定時,這個式子的轉移方式也是固定的。所以可以列舉每個k。而對於每乙個k,我們很容易得到乙個矩陣 10 k,1,1 0,1,1 0 1,1 對每乙個k,就可以快速計算答案。code i...