数据包:http://pan.baidu.com/s/1pJNSkL9
T1:
我们先直接用矩阵快速幂暴力
首先是0维,f1=1,f2=1
然后推出下一维的f1'和f2'
下一维的f1'和f2'其实就是f1+f2+f3+....+fn和f2+f3+f4+...+fn+1
所以f1'=sn,f2'=s(n+1)-f1
所以可以klogn求出答案
但是我们做了很多相同的事情,求sn和s(n+1)的时候求出来的矩阵是一样的
所以可以是logn+k的
但是既然是一样的其实f1,f2推到f1'和f2'是可以快速幂的
于是就变成了logn+logk的了
1 const 2 h=1000000007; 3 type 4 matrix=array[1..3,1..3]of int64; 5 const 6 d:matrix=((1,0,0),(1,0,1),(0,1,1)); 7 var 8 n,k:int64; 9 t:longint; 10 a,b,c:matrix; 11 12 operator *(a,b:matrix)c:matrix; 13 var 14 i,j,k:longint; 15 begin 16 fillchar(c,sizeof(c),0); 17 for i:=1 to 3 do 18 for j:=1 to 3 do 19 for k:=1 to 3 do 20 c[i,j]:=(c[i,j]+a[i,k]*b[k,j])mod h; 21 end; 22 23 procedure main; 24 var 25 i:longint; 26 begin 27 read(n,k); 28 b:=d; 29 fillchar(a,sizeof(a),0); 30 for i:=1 to 3 do 31 a[i,i]:=1; 32 while n>0 do 33 begin 34 if n and 1=1 then a:=a*b; 35 b:=b*b; 36 n:=n>>1; 37 end; 38 b:=a*d; 39 fillchar(c,sizeof(c),0); 40 c[1,1]:=a[2,1]; 41 c[2,1]:=a[3,1]; 42 c[1,2]:=(b[2,1]-1+h)mod h; 43 c[2,2]:=b[3,1]; 44 fillchar(a,sizeof(a),0); 45 for i:=1 to 3 do 46 a[i,i]:=1; 47 while k>0 do 48 begin 49 if k and 1=1 then a:=a*c; 50 c:=c*c; 51 k:=k>>1; 52 end; 53 writeln((a[1,1]+a[2,1])mod h); 54 end; 55 56 begin 57 read(t); 58 while t>0 do 59 begin 60 dec(t); 61 main; 62 end; 63 end.