FFT解決組合數問題

2021-09-12 14:33:58 字數 1988 閱讀 8671

有k種元素,均有無窮多個,規定第i種元素選取的個數ci必須屬於乙個特定的集合si,當需要選取r個元素時,有多少種選取方式?

exp:有蘋果,香蕉和桃子3種水果,如果蘋果只能選不超過3個,選香蕉的個數必須是5的倍數,而桃子的個數必須是素數,問選r個水果有幾種方法。

solution:解決方法是把每個集合寫成乙個多項式,使得每一項x^i的係數取決於i是否在集合中存在:如果存在,則係數等於1;否則,係數等於0。這樣蘋果對應的多項式是1+x+x2+x3…香蕉x5+x10+x15…桃子x2

+x3+x5+x7…然後把多項式乘起來,就行了,結果中xr的係數就是選r個元素的方法數。

super poker ii uva - 12298

題目大意:

有一副超級撲克牌,超級撲克牌由四個花色組成,每個花色都有無數張牌,撲克牌的面值p滿足條件:p的約數的個數大於2,即撲克牌的面值為:4,6,8,9,10,12,…(不包括1和素數的自然數) 現在這幅撲克牌丟失了c張,問你從剩餘的撲克牌的4個花色中各選出一張牌來,四個花色的面值之和組成乙個新的值,問分別有多少種選法能組成值a, a+1, a+2,…,b。 輸出b-a+1行,每行乙個數代表選法的個數。

思路:跟選水果的那個思路一樣,這裡是四個多項式相乘,注意開陣列大小。

#include

using

namespace std;

// -------------------- fft --------------------/

typedef

long

double db;

const db pi =

acos(-

1.0)

;struct complex

complex operator-(

const complex &b)

const

complex operator+(

const complex &b)

const

complex operator*(

const complex &b)

const};

void

change

(complex y,

int len)

if(j < k) j+

=k;}

}void

fft(complex y,

int len,

int on)}}

if(on ==-1

)}}// -------------------------fft-------------------------/

intidx

(char c)

typedef

long

long ll;

int a, b, c;

const

int maxb =

50000

+100

;complex x[4]

[maxb*4*

2];bool notprime[maxb]

;void

init()

}}}int

main()

for(

int i = len0; i < len; i++)}

for(

int i =

0; i < c; i++

)for

(int i =

0; i <

4; i++

)for

(int i =

0; i < len; i++

)fft

(x[0

], len,-1

);for(

int i = a; i <= b; i++

)printf

("\n");

}return0;

}/*12 20 2

4s 6h

0 0 0

*/

組合數問題

題目描述 組合數c n mc n m 表示的是從n個物品中選出m個物品的方案數。舉個例子,從 1,2,3 三個物品中選擇兩個物品可以有 1,2 1,3 2,3 這三種選擇方法。根據組合數的定 義,我們可以給出計算組合數的一般公式 c n m fracc n m m n m n 其中n 1 2 n 小...

問題 A 組合數

唯一分解定理在此 時間限制 1 sec 記憶體限制 128 mb 提交 1938 解決 147 提交 狀態 命題人 jsu admin 題目描述 求組合數c n,m 以及c n,m 因子個數。輸入n和m,其中0 m n 50,以eof結束。輸出該組合數結果 樣例輸入 copy 3 2 4 2樣例輸出...

組合數問題

問題描述 組合數表示的是從n個物品中選出m個物品的方案數。舉個例子,從 1,2,3 三個物品中選擇兩個物品可以有 1,2 1,3 2,3 這三種選擇方法。根據組合數的定義,我們可以給出計算組合數的一般公式 其中n 1 2 n。小蔥想知道如果給定n,m和k,對於所有的0 i n,0 j min i,m...