using System; using System.Collections.Generic; using System.Collections; using System.Collections.Specialized; using System.Linq; using System.Text; using System.IO; using System.Reflection; using static System.Math; using System.Numerics; static class Program{ const int mod=(int)1e9+7; const double eps=1e-11; static void Main(){ Sc sc=new Sc(); var s=sc.Ia; Fc fc=new Fc(s[0]); for(int i = 0;ij){g[i][j]=g[j][i];} else{g[i][j]=fc.Get(0,i,j,s[0]-1);} } } b[0][0]=1; var c=Mp(b,g,s[2]); Console.WriteLine("{0}",c[s[0]-1][0]); } static long[][] Mp(long[][] r,long[][] x,long e){ while(e>0){ if((e&1)>0){r=Mm(x,r);} x=Mm(x,x); e>>=1; } return r; } static long[][] Mm(long[][] a,long[][] b){ var q=new long[a.Length][]; for(int j=0;j[] li; private int[][] dat1,dat2,dat3; private int m=1,cnt; private bool bo=false; public Fc(int n){ while(m[n]; dat1=new int[m-1][]; dat2=new int[m-1][]; dat3=new int[m-1][]; for(int i = 0;i();} } public void Ud(int x,int y){li[x].Add(y);} private void Dn(){ for(int i = 0;i>1)+(m>>1)-1; if(i+1>1)-2;i>=0;i--) { if(dat1[(i<<1)+2]!=null){ dat1[i]=new int[dat1[(i<<1)+1].Length+dat1[(i<<1)+2].Length-1]; dat2[i]=new int[dat1[(i<<1)+1].Length+dat1[(i<<1)+2].Length-1]; dat3[i]=new int[dat1[(i<<1)+1].Length+dat1[(i<<1)+2].Length-1]; int j=0,k=0; while(j1){ mid=(ub+lb)>>1; if(dat1[0][mid]>y2){ub=mid;} else{lb=mid;} } int p=ub; lb=-1;ub=dat1[0].Length; while(ub-lb>1){ mid=(ub+lb)>>1; if(dat1[0][mid]>=y1){ub=mid;} else{lb=mid;} } return Fdg(x1,x2,0,0,m-1,ub,p); } private int Fdg(int a,int b,int k,int l,int r,int la,int ra){ if(r>1,dat2[k][la],dat2[k][ra])+Fdg(a,b,k*2+2,(l+r+1)>>1,r,dat3[k][la],dat3[k][ra]);} } } public class Sc{ public int I{get{return int.Parse(Console.ReadLine());}} public long L{get{return long.Parse(Console.ReadLine());}} public double D{get{return double.Parse(Console.ReadLine());}} public string S{get{return Console.ReadLine();}} public int[] Ia{get{return Array.ConvertAll(Console.ReadLine().Split(),int.Parse);}} public long[] La{get{return Array.ConvertAll(Console.ReadLine().Split(),long.Parse);}} public double[] Da{get{return Array.ConvertAll(Console.ReadLine().Split(),double.Parse);}} public string[] Sa{get{return Console.ReadLine().Split();}} public object[] Oa{get{return Console.ReadLine().Split();}} public int[] Ia2{get{return Array.ConvertAll(("0 "+Console.ReadLine()+" 0").Split(),int.Parse);}} public int[] Ia3(int a){return Array.ConvertAll((a.ToString()+" "+Console.ReadLine()).Split(),int.Parse);} public int[] Ia3(bool a,int b,bool c,int d){return Array.ConvertAll(((a?b.ToString()+" ":"")+Console.ReadLine()+(c?" "+d.ToString():"")).Split(),int.Parse);} public long[] La2{get{return Array.ConvertAll(("0 "+Console.ReadLine()+" 0").Split(),long.Parse);}} public long[] La3(int a){return Array.ConvertAll((a.ToString()+" "+Console.ReadLine()).Split(),long.Parse);} public long[] La3(bool a,int b,bool c,int d){return Array.ConvertAll(((a?b.ToString()+" ":"")+Console.ReadLine()+(c?" "+d.ToString():"")).Split(),long.Parse);} public double[] Da2{get{return Array.ConvertAll(("0 "+Console.ReadLine()+" 0").Split(),double.Parse);}} public double[] Da3(int a){return Array.ConvertAll((a.ToString()+" "+Console.ReadLine()).Split(),double.Parse);} public double[] Da3(bool a,int b,bool c,int d){return Array.ConvertAll(((a?b.ToString()+" ":"")+Console.ReadLine()+(c?" "+d.ToString():"")).Split(),double.Parse);} public T[] Arr(int n,Func f){var a=new T[n];for(int i=0;i(int n,Func f){var a=new T[n];for(int i=0;i(int n,Func f){var a=new T[n];for(int i=0;i(int n,Func f){var a=new T[n];for(int i=0;i