Advertisement
yicongli

LG5204

Mar 26th, 2019
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.13 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define gc c=getchar()
  6. #define r(x) read(x)
  7. #define ll long long
  8.  
  9. template<typename T>
  10. inline void read(T&x){
  11.     x=0;T k=1;char gc;
  12.     while(!isdigit(c)){if(c=='-')k=-1;gc;}
  13.     while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
  14. }
  15.  
  16. const int p=1e9+7;
  17. const int N=1e5+7;
  18.  
  19. inline ll qpow(ll a,ll b){
  20.     ll ans=1;
  21.     while(b){
  22.         if(b&1)(ans*=a)%=p;
  23.         (a*=a)%=p;
  24.         b>>=1;
  25.     }
  26.     return ans;
  27. }
  28.  
  29. inline int sub(int a,int b){
  30.     return (a-=b)<0?a+p:a;
  31. }
  32.  
  33. int n,k;
  34. int f[N];
  35. int c[N];
  36.  
  37. inline ll solve(int c,int len){
  38.     ll x=1e9-c;
  39.     ll t=qpow(x,k);
  40.     f[0]=1;
  41.     for(int i=1;i<=len;++i){
  42.         f[i]=(x+1)*f[i-1]%p;
  43.         if(i>=k)f[i]=sub(f[i],t*(i==k?1:f[i-k-1])%p);
  44.     }
  45.     return f[len];
  46. }
  47.  
  48. int main(){
  49.     // freopen(".in","r",stdin);
  50.     // freopen(".out","w",stdout);
  51.     r(n),r(k);
  52.     for(int i=1;i<=n-k+1;++i){
  53.         r(c[i]);
  54.     }
  55.     ll ans=1;
  56.     for(int i=1,j;i<=n-k+1;i=j+1){
  57.         for(j=i;c[j+1]==c[j];++j);
  58.         int len=j-i+k;
  59.         if(i!=1&&c[i]<c[i-1])len-=k;
  60.         if(j!=n-k+1&&c[j]<c[j+1])len-=k;
  61.         if(len<-1){
  62.             ans=0;
  63.             break;
  64.         }
  65.         if(len>0)ans=ans*solve(c[i],len)%p;
  66.     }
  67.     printf("%lld\n",ans);
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement