#include #include #include #include #include #define SIZE 70 #define MOD 1000000007 #define MX 1000005 using namespace std; typedef long long int ll; struct Matrix { int n; ll A[SIZE][SIZE]; ll mpow(ll x,ll t) { if(t==0) return 1; ll ret=mpow(x,t/2); ret=ret*ret%MOD; if(t%2==1) ret=ret*x%MOD; return ret; } ll inv(ll x) { return mpow(x,MOD-2);//if MOD is a prime number } void init(int m) { n=m; for(int i=0;i=MOD) A[a][b]-=MOD; } }; Matrix SUM_mat,PR_mat; void product(Matrix&A,Matrix&B) { int n=A.n; PR_mat.init(n); for(int i=0;i=MOD) PR_mat.A[i][j]-=MOD; } } } } void sumsum(Matrix&A,Matrix&B) { int n=A.n; SUM_mat.init(n); for(int i=0;i=MOD) SUM_mat.A[i][j]-=MOD; } } } } Matrix mt[SIZE]; void mpow(Matrix&M,ll t,int dep) { if(t==1) { mt[dep]=M; return; } mpow(M,t/2,dep+1); product(mt[dep+1],mt[dep+1]); mt[dep]=PR_mat; if(t%2==1) { product(mt[dep],M); mt[dep]=PR_mat; } } Matrix mat; int A[MX],F[MX]; int n; ll k; int get(int i,int j) { if(i==n-1) return 1; return i+1==j?1:0; } int main() { scanf("%d %lld",&n,&k); for(int i=0;i