矩阵乘法练手。。。
第一次写,各种错误,累死了。。。
type matrix=record jz:array[1..20,1..20] of int64; end; var k,n,mi,a:int64; i,j:longint; f:array[1..100] of int64; ans:matrix; sum:array[0..100] of matrix; function chen(x,y:matrix):matrix; var i,j,l:longint; begin for i:=1 to k do for j:=1 to k do begin chen.jz[i,j]:=0; for l:=1 to k do chen.jz[i,j]:=(chen.jz[i,j]+x.jz[i,l]*y.jz[l,j]) mod 7777777; end; end; function need(i:int64):int64; begin need:=0; while i mod 2=0 do begin inc(need); i:=i div 2; end; end; begin readln(k,n); for i:=1 to k-1 do sum[0].jz[i,i+1]:=1; for i:=1 to k do sum[0].jz[k,i]:=1; for i:=1 to 32 do sum[i]:=chen(sum[i-1],sum[i-1]); mi:=n-k; for i:=1 to k do ans.jz[i,i]:=1; while mi>0 do begin ans:=chen(ans,sum[need(mi)]); mi:=mi-1 shl need(mi); end; //get ans ju zhen for i:=1 to k do f[i]:=1; for i:=2 to k do for j:=1 to i-1 do f[i]:=f[i]+f[j]; if k=n then begin write(f[n]); exit; end; for i:=1 to k do a:=(a+ans.jz[k,i]*f[i]) mod 7777777; write(a); end.