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 begin 14 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 var 20 c:char; 21 begin 22 read(c); 23 while c<>' ' do 24 begin 25 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 var 33 i:longint; 34 begin 35 dec(a[a[0]]); 36 i:=a[0]; 37 while a[i]<0 do 38 begin 39 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 var 46 i:longint; 47 y:matrix; 48 begin 49 z[0,1]:=1;z[0,2]:=0; 50 for i:=1 to 9 do 51 z[i]:=z[i-1]*x; 52 x:=z[0]; 53 for i:=1 to a[0] do 54 begin 55 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 begin 65 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 begin 80 main; 81 end.