首页 > 代码库 > 3240: [Noi2013]矩阵游戏

3240: [Noi2013]矩阵游戏

Description

婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的n行m列的矩阵(你不用担心她如何存储)。她生成的这个矩阵满足一个神奇的性质:若用F[i][j]来表示矩阵中第i行第j列的元素,则F[i][j]满足下面的递推式:

F[1][1]=1
F[i,j]=a*F[i][j-1]+b (j!=1)
F[i,1]=c*F[i-1][m]+d (i!=1)
递推式中a,b,c,d都是给定的常数。

现在婷婷想知道F[n][m]的值是多少,请你帮助她。由于最终结果可能很大,你只需要输出F[n][m]除以1,000,000,007的余数。
Input

一行有六个整数n,m,a,b,c,d。意义如题所述
Output

包含一个整数,表示F[n][m]除以1,000,000,007的余数
Sample Input
3 4 1 3 2 6
Sample Output
85
HINT

样例中的矩阵为:

1 4 7 10

26 29 32 35

76 79 82 85

 

为什么有这么多人都用了费马小定理,蒟蒻表示不能理解and不敢使用

很容易构造出矩阵

F=[1,1]  A=[a,b]  B=[c,d]  ANS=F*(A^(n-1)*B)^(m-1)*A^(n-1)

                 [0,1]      [0,1]用快速幂就好,因为数字太大,所以就直接用10进制快速幂然后发现其实矩阵中第二行一直没变,我们只要用第一行的两个数就行了,然后矩阵乘法就变成了一个奇怪的运算([a,b]*[c,d]=[a*c,c*b+d]),这样矩阵乘法的常数就小了很多,就可以了

 1 const 2     h=1000000007; 3 type 4     matrix=array[1..2]of int64; 5     big=array[0..1001000]of longint; 6 var 7     n,m:big; 8     z:array[0..10]of matrix; 9     x,y:matrix;10     a,b,c,d:longint;11   12 operator *(a,b:matrix)c:matrix;13 begin14     c[1]:=a[1]*b[1]mod h;15     c[2]:=(b[1]*a[2]+b[2])mod h;16 end;17   18 procedure get(var a:big);19 var20     c:char;21 begin22     read(c);23     while c<>  do24         begin25             inc(a[0]);26             a[a[0]]:=ord(c)-ord(0);27             read(c);28         end;29 end;30   31 procedure decc(var a:big);32 var33     i:longint;34 begin35     dec(a[a[0]]);36     i:=a[0];37     while a[i]<0 do38         begin39             dec(a[i-1]);inc(a[i],10);40             dec(i);41         end;42 end;43   44 function f(x:matrix;var a:big):matrix;45 var46     i:longint;47     y:matrix;48 begin49     z[0,1]:=1;z[0,2]:=0;50     for i:=1 to 9 do51         z[i]:=z[i-1]*x;52     x:=z[0];53     for i:=1 to a[0] do54         begin55             y:=x*x;56             x:=x*y*y;57             x:=x*x;58             x:=x*z[a[i]];59         end;60     exit(x);61 end;62   63 procedure main;64 begin65     get(n);get(m);66     read(a,b,c,d);67     decc(n);decc(m);68     x[1]:=a;69     x[2]:=b;70     x:=f(x,m);71     y[1]:=c;72     y[2]:=d;73     y:=x*y;74     y:=f(y,n);75     y:=y*x;76     writeln((y[1]+y[2])mod h);77 end;78   79 begin80     main;81 end.
View Code