数据包: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.
View Code

相关文章: