C. Yet Another Number Sequence
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
Everyone knows what the Fibonacci sequence is. This sequence can be defined by the recurrence relation:
Input
The first line contains two space-separated integers n, k (1 ≤ n ≤ 1017; 1 ≤ k ≤ 40).
Output
Print a single integer — the sum of the first n elements of the sequence Ai(k) modulo 1000000007 (109 + 7).
Sample test(s)
input
1 1
output
1
input
4 1
output
34
input
5 2
output
316
input
7 4
output
73825
#include <bits/stdc++.h>
#define _ ios_base::sync_with_stdio(0);cin.tie(0);
using namespace std;
const int D(83);
const long long MOD(1e9+7);
struct Matrix{
long long v[D][D];
int d;
Matrix operator *(const Matrix& b)const{
Matrix ret;
ret.d=d;
for(int i=0;i<d;i++)
for(int j=0;j<d;j++){
ret.v[i][j]=0;
for(int k=0;k<d;k++)ret.v[i][j]+=(v[i][k]*b.v[k][j])%MOD,ret.v[i][j]%=MOD;
}
return ret;
}
Matrix operator^(long long p){
Matrix ret,tmp=*this;
memset(ret.v,0,sizeof(ret.v));
ret.d=d;
for(int i=0;i<d;i++)ret.v[i][i]=1;
while(p){
if(p&1){
ret=ret*tmp;
}
p>>=1;
tmp=tmp*tmp;
}
return ret;
}
void init(int k){
memset(v,0,sizeof(v));
d=2*(k+1)+1;
v[0][0]=1;
for(int i=0;i<=k;i++){
//v[1+i][k+1]=2;v[1+i][1+i]=2;//LT
v[1+i][k+1]=1;v[1+i][1+i]=1;//LT
v[1+i][2*k+2]=1;v[1+i][2+i+k]=1;//RT
v[2+k+i][k+1]=1;v[2+k+i][1+i]=1;//LB
//v[2+k+i][2*k+2]=1;v[2+k+i][2+k+i]=1;//RB
}
int dx[]={0,0,k+1,k+1};
int dy[]={0,k+1,0,k+1};
for(int i=k-1;i;i--)
for(int j=i+1;j<k+1;j++)
for(int k=0;k<4;k++){
v[dx[k]+i][dy[k]+j]=(v[dx[k]+i+1][dy[k]+j]+v[dx[k]+i+1][dy[k]+j+1])%MOD;
}
for(int i=1;i<=k+1;i++){
v[0][i]=v[0][k+1+i]=v[1][k+1+i];
}
}
};
int main(){
_;
long long n;
int k;
cin>>n>>k;
Matrix A;
A.init(k);
A=A^(n-1);
long long ans=0;
for(int i=0;i<2*(k+1)+1;i++)ans+=A.v[0][i],ans%=MOD;
cout<<ans<<endl;
return 0;
}