bzoj4555 數學推導 畫柿子 NTT)

2021-08-07 12:17:24 字數 1605 閱讀 7146

題面

今天學了多項式逆元,找到了這題。但是本蒟蒻覺得這題和逆元並沒有什麼關係,和逆元有關的題解也看不懂。。。

題目要你求這樣乙個函式,結果對乙個費馬素數取模。

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