package yukicoder; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintStream; import java.io.PrintWriter; import java.util.Arrays; import java.util.Iterator; 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)solve2(n,(int)k); long ansS=0,ansF=0; int[][] a=new int[n+1][1]; 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); } } }