package yukicoder; import java.util.Arrays; import java.util.Scanner; public class Main{ public static void main(String[] args)throws Exception{ new Main().solve(); } final long mod=1_000_000_000+7; void solve(){ Scanner sc=new Scanner(System.in); int n=sc.nextInt(); long k=sc.nextLong(); if(n>1000){ long[] S=new long[(int)k+2]; long sum=0; for(int i=0;i0;n=n>>1){ if((n&1)==1)v=MtPrd(A,v,mod); A=p2(A,mod); } return v; } int[][] MtPrd(int[][] A,int[][] B,long mod){ int[][] C=new int[A.length][B[0].length]; for(int i=0;i=BIG)sum-=BIG; } C[i][j]=(int)(sum%mod); } } return C; } int[][] p2(int[][] A,long mod){ int n=A.length; int[][] C=new int[n][n]; for(int i=0;i=BIG)sum[j]-=BIG; } } for(int j=0;j it; // Scanner(InputStream in){ // br=new BufferedReader(new InputStreamReader(in)); // } // String next()throws RuntimeException{ // try{ // if(it==null||!it.hasNext()) // it=Arrays.asList(br.readLine().split(" ")).iterator(); // return it.next(); // }catch(IOException e){ // throw new IllegalStateException(); // } // } // int nextInt() throws RuntimeException{ // return Integer.parseInt(next()); // } // long nextLong() throws RuntimeException{ // return Long.parseLong(next()); // } // double nextDouble() throws RuntimeException{ // return Double.parseDouble(next()); // } // void close(){ // try{ // br.close(); // }catch(IOException e){ // throw new IllegalStateException(); // } // } // } // private static class Printer extends PrintWriter{ // Printer(PrintStream out){ // super(out); // } // } }