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