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){
- T k=1;char gc;x=0;
- 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=1e6+7;
- inline int add(int a,int b){
- return (a+=b)>=p?a-p:a;
- }
- struct mat{
- int a[20][20];
- inline int* operator [](int x){
- return a[x];
- }
- inline const int* operator [](const int &x)const{
- return a[x];
- }
- inline mat(){
- memset(a,0,sizeof(a));
- }
- };
- inline mat operator *(const mat &a,const mat &b){
- mat ret;
- for(int i=0;i<20;++i){
- for(int k=0;k<20;++k){
- if(!a[i][k])continue;
- for(int j=0;j<20;++j){
- ret[i][j]=add(ret[i][j],(ll)a[i][k]*b[k][j]%p);
- }
- }
- }
- return ret;
- }
- inline mat qpow(mat a,ll b){
- mat ans;
- for(int i=0;i<20;++i){
- ans[i][i]=1;
- }
- while(b){
- if(b&1)ans=ans*a;
- a=a*a;
- b>>=1;
- }
- return ans;
- }
- mat g;
- int t[25][N];
- int main(){
- freopen("string.in","r",stdin);
- freopen("string.out","w",stdout);
- int n;r(n);
- ll m;r(m);
- int x=n/2;
- for(int i=1;i<=n;++i){
- t[1][i]=1;
- }
- for(int i=2;i<=20;++i){
- for(int j=1,sum=0,k=1;j<=n;++j){
- for(;k*2<=j;++k)sum=add(sum,t[i-1][k]);
- t[i][j]=sum;
- }
- }
- for(int i=1;i<=20;++i){
- for(int j=x+1;j<=n;++j){
- g[i-1][0]=add(g[i-1][0],t[i][j]);
- }
- }
- for(int i=1;i<20;++i){
- g[i-1][i]=1;
- }
- printf("%d\n",qpow(g,m)[0][0]);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement