洛谷 P5748 集合劃分計數 題解

2021-10-06 17:45:14 字數 3011 閱讀 3265

題目傳送門

題目大意:多次詢問,求貝爾數的第 n

nn 項。

先考慮只有乙個集合的情況,設 f

if_i

fi​ 表示 i

ii 個不同元素分成 1

11 個集合的方案數,顯然有 fi=

1f_i=1

fi​=

1,由於不允許有空集,所以 f0=

0f_0=0

f0​=0。

設 f

ff 的 egf

egfeg

f 為 f(x

)f(x)

f(x)

,發現 f(x

)f(x)

f(x)

正好就是 ex−

1e^x-1

ex−1

。然後考慮求答案:顯然題目要我們求的其實就是貝爾數,設貝爾數的第 n

nn 項為 b

nb_n

bn​,設 g(x

)g(x)

g(x)

為 bb

b 的 egf

egfeg

f,那麼滿足 g(x

)=∑i

=0fi

i!

g(x)=\sum_ \dfrac

g(x)=∑

i=0​

i!fi

​,所以 g(x

)=ef

=eex

−1

g(x)=e^f=e^

g(x)=e

f=ee

x−1。

由於是 egf

egfeg

f,所以 bn=

[xn]

g(x)

×n

!b_n=[x^n]g(x)\times n!

bn​=[x

n]g(

x)×n

!。順便紀念一下,除了求逆部分漏了個取模,第一次 一次寫對多項式全家桶!

**如下:

#include

#include

#include

#include

using

namespace std;

#define maxn 300010

#define mod 998244353

#define ms(f,x) memset(f,0,4<<(x))

#define bin(x) (1<<(x))

int t,n;

int inv[maxn]

,log_2[maxn]

;int

ksm(

int x,

int y)

int*w[30]

;void

prep

(int n)

}int limit,r[maxn]

;void

get(

int lg)

void

ntt(

int*f,

int lg,

int type=0)

}void

ntt(

int*f,

int*g,

int ln)

int a[maxn]

,b[maxn]

,c[maxn]

,d[maxn]

,e[maxn]

;void

getinv

(int

*f,int

*g,int ln)

getinv

(f,g,

(ln+1)

>>1)

;int lg=log_2[ln*2-

1];get

(lg);ms

(a,lg);ms

(b,lg)

;memcpy

(a,f,ln<<2)

;memcpy

(b,g,ln<<2)

;ntt

(a,lg)

;ntt

(b,lg)

;for

(int i=

0;i<

bin(lg)

;i++

)a[i]

=1ll*(

2-1ll*a[i]

*b[i]

%mod+mod)

%mod*b[i]

%mod;

ntt(a,lg,1)

;for

(int i=

0;i)g[i]

=1ll

*a[i]

*inv[

bin(lg)

]%mod;

}void

dao(

int*f,

int*g,

int ln)

void

jifen

(int

*f,int

*g,int ln)

void

getln

(int

*f,int

*g,int ln)

void

getexp

(int

*f,int

*g,int ln)

getexp

(f,g,

(ln+1)

>>1)

;ms(e,log_2[ln*2-

1]);

getln

(g,e,ln)

;for

(int i=

0;i)e[i]

=(f[i]

-e[i]

+mod)

%mod;e[0]

++;ntt(g,e,ln);}

int fac[maxn]

,inv_fac[maxn]

;voidwk(

int n)

int f[maxn]

,g[maxn]

;void

solve()

intmain()

LuoguP5748 集合劃分計數

乙個有 n 個元素的集合,將其分為任意個非空子集,求方案數。集合之間是無序的,設 f n 表示用 n 個元素組成的集合的個數,顯然 f n 1 設 f x 為 f 的指數型生成函式,那麼 f x sum frac f i x 的第 n 位就是 i 個元素個數之和為 n 的集合組合在一起的方案數。設 ...

洛谷P1978 集合

題目鏈結 顯然,我們是要把資料先排序的,然後從大到小列舉每個數,看是否能選上,能選就選,不能拉倒 若能,二分查詢a i k,若查詢成功,ans 將a i k標記為不能選擇 最後輸出答案即可 從小到大列舉會爆long long 1 include2 include3 include4 include5...

洛谷P1491 集合位置

每次有大的活動,大家都要在一起 聚一聚 不管是去好樂迪,還是避風塘,或者湯姆熊,大家都要玩的痛快。還記得心語和花兒在跳舞機上的激情與釋放,還記得草草的投籃技藝是如此的高超,還記得狗狗的槍法永遠是 s 還有不能忘了,胖子的歌聲永遠是讓我們驚叫的!今天是野貓的生日,所以想到這些也正常,只是因為是上學日,...