Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define gc c=getchar()
- #define r(x) read(x)
- #define ll long long
- template<typename T>
- inline void read(T&x){
- x=0;T k=1;char gc;
- while(!isdigit(c)){if(c=='-')k=-1;gc;}
- while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
- }
- const int p=1e9+7;
- const int N=1e5+7;
- inline ll qpow(ll a,ll b){
- ll ans=1;
- while(b){
- if(b&1)(ans*=a)%=p;
- (a*=a)%=p;
- b>>=1;
- }
- return ans;
- }
- inline int sub(int a,int b){
- return (a-=b)<0?a+p:a;
- }
- int n,k;
- int f[N];
- int c[N];
- inline ll solve(int c,int len){
- ll x=1e9-c;
- ll t=qpow(x,k);
- f[0]=1;
- for(int i=1;i<=len;++i){
- f[i]=(x+1)*f[i-1]%p;
- if(i>=k)f[i]=sub(f[i],t*(i==k?1:f[i-k-1])%p);
- }
- return f[len];
- }
- int main(){
- // freopen(".in","r",stdin);
- // freopen(".out","w",stdout);
- r(n),r(k);
- for(int i=1;i<=n-k+1;++i){
- r(c[i]);
- }
- ll ans=1;
- for(int i=1,j;i<=n-k+1;i=j+1){
- for(j=i;c[j+1]==c[j];++j);
- int len=j-i+k;
- if(i!=1&&c[i]<c[i-1])len-=k;
- if(j!=n-k+1&&c[j]<c[j+1])len-=k;
- if(len<-1){
- ans=0;
- break;
- }
- if(len>0)ans=ans*solve(c[i],len)%p;
- }
- printf("%lld\n",ans);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement