题目描述
数据范围
输入描述
输出描述
输入样例1
6
0 1 2 3 4 5
输出样例1
3
样例1解释
输入样例2
3
0 0 0
输出样例2
6
输入样例3
54
0 0 1 0 1 2 1 2 3 2 3 3 4 4 5 4 6 5 7 8 5 6 6 7 7 8 8 9 9 10 10 11 9 12 10 13 14 11 11 12 12 13 13 14 14 15 15 15 16 16 16 17 17 17
输出样例3
115295190
题目大意: N 个人站成一列,每个人都戴着一顶帽子,颜色为红、黄、绿的一种。第 i 个人前面有 ai 个人戴着和他颜色相同的帽子。求出 N 个人帽子颜色的所有组合方案。
由题意可得,每种颜色的前置相同颜色数目一定是逐渐增大的,即对于在 ai 位置上的某个数字 n ,一定可以在其之前找到 0 ~ n - 1 。而由于本题需要考虑到所有的组合方案,因此对于 n ,若其之前存在多个尚未被匹配的 n - 1,则可以存在多种方案。例如序列: 0 0 1 1 2,对于第一个 1 ,可以与前两个 0 进行任意匹配,由此方案数 * 2,而对于第二个 1 ,因为之前的其中一个 0 已经被匹配,该 1 对应的匹配方案就是固定的;而对于序列中的 2 同理,存在两个可配对的 1 因此方案数 * 2 。
参考代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1000000007;
const int N=1e6+10;
int a[N];
ll m[3];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
ll ans=1;
for(int i=1;i<=n;i++){
ll cnt=0;
int x;
if(a[i]==m[0]) {
cnt++;x = 0;}
if(a[i]==m[1]) {
cnt++;x = 1;}
if(a[i]==m[2]) {
cnt++;x = 2;}
ans*=cnt;
ans%=mod;
m[x]++;
}
cout<<ans<<endl;
}