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;
} 

猜你喜欢

转载自blog.csdn.net/m0_37611893/article/details/80464896