链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
有 n 个格子,当你位于第 x 个格子时,你可以进行以下两种操作:
- 走到第 x+1 个格子。
- 如果第 x 个格子未被染上色,把第 x 个格子染成黑色,然后跳到第 个格子。
现在你要从第 1 个格子开始,回答把所有格子染成黑色的顺序有多少种?答案对 取模。
输入描述:
第一行一个正整数 n () 第二行包括 n 个整数,第 i 个数表示 ( )保证 单调不降。
输出描述:
输出一行包括一个整数,表示答案对 取模后的值。
题目分析
由说明可以看出来题目和排列组合有一定关联,通过多举几个例子找到解决问题的方法。
eg1 n=2时,如果a[2]=1,1。这时候会发现输出是2,恰好是2的全排列个数。
如果a[2]=1,2。这时候会发现输出是1。也就是2 的分支少了一半
eg2 n=3时,如果a[3]=1,1,1。这时候会发现输出是6,恰好是3的全排列个数。
如果a[3]=1,1,2。这时候会发现输出是4,也就是3后面只能跟2,
3后面跟1的情况无法出现,即[2,3,1]和[3,1,2]是不能出现的。
eg3 n=4时,如果a[4]=1,1,1,1。这时候会发现输出是24,恰好是4的全排列个数。
如果a[3]=1,1,1,2。这时候会发现输出是18,也就是4后面只能跟2,3,
4后面跟1的情况无法出现,即:
[2,4,1,3] [2,3,4,1] [3,4,1,2] [3,2,4,1] [4,1,2,3] [4,1,3,2]是不能出现的。
如果a[3]=1,1,1,3。这时候会发现输出是12,也就是4后面只能跟3,
4后面跟1,2的情况无法出现,即:
[2,4,1,3] [2,3,4,1] [3,4,1,2] [3,2,4,1] [4,1,2,3] [4,1,3,2]
[1,4,2,3] [1,3,4,2] [3,4,2,1] [3,1,4,2] [4,2,1,3] [4,2,3,1]是不能出现的。
所以最后的ans=(1-a[1]+1)*(2-a[2]+1)*(3-a[3]+1)*...
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n=0;
ll ans=1;
const ll mod= 1e9 + 7;
int main()
{
cin>>n;
for (ll i=1;i<=n;i++)
{
ll a;
cin>>a;
ans=ans*(i-a+1)%mod;
}
cout<<ans;
return 0;
}