【问题】
k种颜色,每种颜色有n个球,每球都一样,问这些球有多少种排列方式
限定条件:每种第i种颜色的最后一个球后面必须是i+1颜色的球【思路】
最后一个球固定是第k种颜色的球,然后其他位置随机放k颜色剩下的球有 C s u m − 1 a [ i ] − 1 C^{a[i]-1}_{sum-1} Csum−1a[i]−1种,sum为剩下位置的数目,a[i]是第i种颜色球的数目
具体操作,初始化排列组合的数组,然后逆元法从最后一种颜色的球开始往前排列
【源代码】
#include<iostream>
#include<cstdio>
#include<string>
#include<cstdlib>
#include<cmath>
using namespace std;
#include<stack>
#include<cstdlib>
#include<string>
#include<cstdio>
#include<cstring>
#include<iomanip>
#include<algorithm>
#include<map>
#define ll long long
ll mod = 1e9 + 7;
ll a[10010];
ll dp[1020][1020];
void init() /*初始化排列组合*/
{
dp[0][0] = 1;
for (int i = 1; i <= 1010; i++)
{
dp[i][i] = dp[i][0] = 1;
for (int j = 1; j < i; j++)
dp[i][j] = (dp[i - 1][j] + dp[i - 1][j - 1]) % mod;
}
}
int main()
{
init();
int k;
cin >> k;
ll sum = 0;
for (int i = 0; i < k; i++)
{
cin >> a[i];
sum += a[i];
}
ll ans = 1;
for (int i = k - 1; i >= 0; i--)
{
ans *= dp[sum - 1][a[i] - 1];
ans %= mod;
sum -= a[i];
}
cout << ans << endl;
return 0;
}