题解:CF466D Increase Sequence
题意
给定一个长度为
思路
有区间加,容易想到在差分数组
最后检查一下
代码
#include <iostream>
using namespace std;
typedef long long ll;
const int N = 2005, Mod = 1e9+7;
int Diff[N];
void Assert(bool f) {if(f) cout<<0<<endl, exit(0);}
int main() {
int n, k; cin>>n>>k, Diff[0]=k;
for(int i=1;i<=n;i++) cin>>Diff[i], Assert(Diff[i]>k);
for(int i=n;i>=1;i--) Diff[i]-=Diff[i-1], Assert(abs(Diff[i])>1);
int Ans=1, Cnt=0;
for(int i=1;i<=n;i++)
if(Diff[i]==-1) Cnt++;
else if(Diff[i]==1) Ans=(ll)Ans*Cnt%Mod, Cnt--;
else Ans=(ll)Ans*(Cnt+1)%Mod;
cout<<(Cnt>1? 0:Ans)<<endl;
return 0;
}