链接:
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;
}