题意:
略(说不清楚,自己看题!)
思路:
分析题目中所给的表达式,当B确定时,表达式的含义为:从B1中选A1个数,同时从B2中选A2个数,同时从B3个数中选A3个数,…,同时从Bn个数中选An个数,总共有多少种方法。得到一个子问题。
子问题解决:记sumA、sumB分别为此时A、B的元素和。可以先从sumB个元素中选出sumA个元素,但这并没有达到分组的效果。假设这些数都是小球,现在加上木棒以分组。从sumB+n个元素中选出sumA+n个元素,设第1个到第A1个元素为小球,第A1+1个元素为木棒;第A1+1+1个到第A1+1+A2个元素为小球,第A1+1+A2+1个元素为木棒,以此类推。加上木棒的目的是在选取小球的过程中进行分组,默认每一组后的第一个元素为木棒。
其实对上面的子问题选取n-1个木棒即可,但选取最后一个木棒的目的是为了第二个子问题:构造所有的B数列。前n-1个木棒是将每一组进行区分,那么第n个木棒的目的就是为了将B中的所有数与B之外的数进行区分(即m-sumB)。
综上可以这样理解:最后一根木棒决定了sumB的大小,前n-1个木棒则是对B进行分组,而至于A的选取已经在分组时完成了。
代码:
//#include <bits/stdc++.h>
#include <iostream>
#include <queue>
#include <list>
#include <set>
#include <map>
#include <vector>
#include <stack>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <cctype>
#include <functional>
#include <string>
#include <cstring>
#include <sstream>
#include <deque>
#define fir first
#define sec second
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
typedef pair<P,int> Q;
const int inf1=1e9+9;
const ll inf2=1e16+9;
const ll mod=1e9+7;
const int maxn=2e5+9;
const ll maxx=1e12+9;
const int DEG=20;
ll n,m,ar[maxn];
ll q_pow(ll x,ll t) {
ll res=1;
while(t) {
if(t&1) res=res*x%mod;
x=x*x%mod; t>>=1;
}
return res;
}
ll inv(ll a) {
return q_pow(a,mod-2);
}
ll c(ll n,ll r) {
if(r>n) return 0;
if(n-r<r) r=n-r;
ll a=1,b=1;
for(int i=1;i<=r;i++) {
a=a*(n-i+1)%mod;
b=b*i%mod;
}
return a*inv(b)%mod;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++) scanf("%d",&ar[i]);
ll sum=0;
for(int i=0;i<n;i++) sum+=ar[i];
printf("%lld\n",c(n+m,sum+n));
}