Wannafly 挑战赛16 A 取石子
題目描述
給出四堆石子,石子數(shù)分別為a,b,c,d。規(guī)定每次只能從堆頂取走石子,問取走所有石子的方案數(shù)。輸入描述:
在一行內(nèi)讀入四個(gè)由空格分隔的整數(shù)a,b,c,d, 輸入均為不超過500的正整數(shù)輸出描述:
輸出一個(gè)整數(shù)表示答案,答案對109+7取模 示例1 輸入 3 5 4 2 輸出 2522520備注:
輸入均為不超過500的正整數(shù)【分析】
每一堆的石子之間的相對位置是固定不變的,所以可以通過插入來生成一個(gè)取石子的順序,而插入的求解則可以利用組合數(shù)來計(jì)算。 起始的時(shí)候,把第一堆的$$$a$$$個(gè)石頭擺好,相當(dāng)于在$$$a$$$個(gè)空位放下$$$a$$$個(gè)石頭,由于石頭順序是固定的,所以有$$$C^a_a$$$種,也就是1種;
接下來,把第二堆的$$$b$$$個(gè)石頭也加進(jìn)來,要在$$$a$$$個(gè)石頭之間以及兩邊插入$$$b$$$個(gè)石頭,等價(jià)于一共有$$$a+b$$$個(gè)位置,在其中選$$$b$$$個(gè)位置,作為放置$$$b$$$的地方,由于$$$b$$$的順序確定,所以組合數(shù)為$$$C^b_{a+b}$$$個(gè)
?
然后把第三堆的$$$c$$$個(gè)石頭也加進(jìn)來,在$$$a+b$$$個(gè)石頭插入$$$c$$$個(gè)石頭,同理,組合數(shù)為$$$C^c_{a+b+c}$$$個(gè);
?
第四堆的$$$d$$$加進(jìn)來就是$$$C^d_{a+b+c+d}$$$個(gè)。 所以最終答案為$$$C^a_a \times C^b_{a+b} \times C^c_{a+b+c} \times C^d_{a+b+c+d}$$$個(gè)
?
【注意】
組合數(shù)較大需要用long long存放;對答案需要取模 可以對組合數(shù)打表,來避免分?jǐn)?shù)取模,公式為$$$C^x_y = C^x_{y-1} + C^{x-1}_{y-1}$$$
?
?
【代碼】
#include<stdio.h> #define N_max 2005 int n; typedef long long ll; #define mod 1000000007ll C[N_max][N_max] = { 0 }; #define min(a,b) ((a)<(b)?(a):(b))int main() {int a[4];ll res = 1;for (int t = 0; t < N_max; ++t)C[t][0]=1;for (int i = 1; i <N_max; ++i)for (int j = 1; j <=i; ++j) {C[i][j] = (C[i - 1][j - 1] + C[i - 1][j])%mod;}for (int i = 0; i < 4; ++i){scanf("%d", a + i);}res = C[a[0]][a[0]];res = res*C[a[0] + a[1]][a[1]]%mod;res = res*C[a[0] + a[1]+a[2]][a[2]]%mod;res = res*C[a[0] + a[1]+a[2]+a[3]][a[3]]%mod;printf("%lld", res);return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/tobyw/p/9094727.html
總結(jié)
以上是生活随笔為你收集整理的Wannafly 挑战赛16 A 取石子的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python-jsonrpc框架实现Js
- 下一篇: 常见问题—打包压缩问题