Wannafly挑戰賽16 A-取石子

鏈接:https://www.nowcoder.com/acm/contest/113/A

題目描述

給出四堆石子,石子數分別爲a,b,c,d。規定每次只能從堆頂取走石子,問取走所有石子的方案數。

輸入描述:

在一行內讀入四個由空格分隔的整數a,b,c,d, 輸入均爲不超過500的正整數

輸出描述:

輸出一個整數表示答案,答案對109+7取模
示例1

輸入

3 5 4 2

輸出

2522520

備註:

輸入均爲不超過500的正整數

分析:

從結果分析,可以看成是從中任意去a個到第一堆中,然後在剩下的裏取b個到第二堆中,接着從剩下的任意取c個到第三堆中,最後剩下的d個放到第四堆中,故結果爲C(a, a+b+c+d)*C(b, b+c+d)*C(c, c+d) = (a+b+c+d)!/(a!b!c!d!)%mod。使用逆元取模即可,代碼如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1000000000+7;
const int maxn = 2005;
ll p[maxn] = {0};
int a, b, c, d;
int ans;

long long quickpow(long long a, long long b) {
    if (b < 0) return 0;
    long long ret = 1;
    a %= mod;
    while(b) {
        if (b & 1) ret = (ret * a) % mod;
        b >>= 1;
        a = (a * a) % mod;
    }
    return ret;
}
long long inv(long long a) {
    return quickpow(a, mod - 2);
}

int main(){
	p[1] = 1;
	for(int i=2; i<=2000; i++){
		p[i] = i*p[i-1]%mod;
	}
	cin>>a>>b>>c>>d;
	int ans = p[a]*p[b]%mod*p[c]%mod*p[d]%mod;
	cout<<p[a+b+c+d]*inv(ans)%mod<<endl;
} 

發佈了41 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章