牛客规律题-取石子

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的正整数

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll mod = 1000000007;
const int maxn = 1000010;
ll qpow(ll a,ll x){
    ll ret=1;
    while (x){
        if (x&1)
            ret = ret*a%mod;
        a=a*a%mod;
        x>>=1;
    }
    return ret;
}
ll fac[maxn],inv[maxn];
 
ll init(){
    fac[0]=1;
    for (int i=1;i<maxn;i++)
        fac[i]=fac[i-1]*i%mod;
    inv[maxn-1]=qpow(fac[maxn-1],mod-2);
    for (int i=maxn-2;i>=0;i--)
        inv[i]=inv[i+1]*(i+1)%mod;
    return 0;
}
 
ll c(ll n,ll m){
    if (n<m) return 0;
    return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
int main()
{
    init();
    int p,q,r,s,sum=0;
    cin>>p>>q>>r>>s;
    ll ans=1;
    sum=p+q+r+s;
    ans=ans*c(sum,p)%mod,sum-=p;
    ans=ans*c(sum,q)%mod,sum-=q;
    ans=ans*c(sum,r)%mod,sum-=r;
    cout<<ans<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Z_sea/article/details/81974997
今日推荐