Advertisement
yicongli

T165T2-DP

Mar 31st, 2019
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.73 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.     T k=1;char gc;x=0;
  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=1e6+7;
  18.  
  19. inline int add(int a,int b){
  20.     return (a+=b)>=p?a-p:a;
  21. }
  22.  
  23. struct mat{
  24.     int a[20][20];
  25.  
  26.     inline int* operator [](int x){
  27.         return a[x];
  28.     }
  29.  
  30.     inline const int* operator [](const int &x)const{
  31.         return a[x];
  32.     }
  33.  
  34.     inline mat(){
  35.         memset(a,0,sizeof(a));
  36.     }
  37. };
  38.  
  39. inline mat operator *(const mat &a,const mat &b){
  40.     mat ret;
  41.     for(int i=0;i<20;++i){
  42.         for(int k=0;k<20;++k){
  43.             if(!a[i][k])continue;
  44.             for(int j=0;j<20;++j){
  45.                 ret[i][j]=add(ret[i][j],(ll)a[i][k]*b[k][j]%p);
  46.             }
  47.         }
  48.     }
  49.     return ret;
  50. }
  51.  
  52. inline mat qpow(mat a,ll b){
  53.     mat ans;
  54.     for(int i=0;i<20;++i){
  55.         ans[i][i]=1;
  56.     }
  57.     while(b){
  58.         if(b&1)ans=ans*a;
  59.         a=a*a;
  60.         b>>=1;
  61.     }
  62.     return ans;
  63. }
  64.  
  65. mat g;
  66. int t[25][N];
  67.  
  68. int main(){
  69.     freopen("string.in","r",stdin);
  70.     freopen("string.out","w",stdout);
  71.     int n;r(n);
  72.     ll m;r(m);
  73.     int x=n/2;
  74.     for(int i=1;i<=n;++i){
  75.         t[1][i]=1;
  76.     }
  77.     for(int i=2;i<=20;++i){
  78.         for(int j=1,sum=0,k=1;j<=n;++j){
  79.             for(;k*2<=j;++k)sum=add(sum,t[i-1][k]);
  80.             t[i][j]=sum;
  81.         }
  82.     }
  83.     for(int i=1;i<=20;++i){
  84.         for(int j=x+1;j<=n;++j){
  85.             g[i-1][0]=add(g[i-1][0],t[i][j]);
  86.         }
  87.     }
  88.     for(int i=1;i<20;++i){
  89.         g[i-1][i]=1;
  90.     }
  91.     printf("%d\n",qpow(g,m)[0][0]);
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement