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 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.

3240: [Noi2013]矩阵游戏

时间: 2024-10-25 21:24:50

3240: [Noi2013]矩阵游戏的相关文章

bzoj 3240: [Noi2013]矩阵游戏 矩阵乘法+十进制快速幂+常数优化

3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 613  Solved: 256[Submit][Status] Description 婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的n行m列的矩阵(你不用担心她如何存储).她生成的这个矩阵满足一个神奇的性质:若用F[i][j]来表示矩阵中第i行第j列的元素,则F[i][j]满足下面的递推式: F[1][1]=1F[i,j]=a*F[i][j-1]+

BZOJ 3240 [Noi2013] 矩阵游戏 题解

转载请注明:http://blog.csdn.net/jiangshibiao/article/details/24594825 [原题] 3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 336  Solved: 158 [Submit][Status] Description 婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的n行m列的矩阵(你不用担心她如何存储).她生成的这个矩阵满足一个神奇的性质

bzoj 3240: [Noi2013]矩阵游戏

Description 婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的n行m列的矩阵(你不用担心她如何存储).她生成的这个矩阵满足一个神奇的性质:若用F[i][j]来表示矩阵中第i行第j列的元素,则F[i][j]满足下面的递推式: F[1][1]=1 F[i,j]=aF[i][j-1]+b (j!=1) F[i,1]=cF[i-1][m]+d (i!=1) 递推式中a,b,c,d都是给定的常数. 现在婷婷想知道F[n][m]的值是多少,请你帮助她.由于最终结果可能很大,你只需要输出F[

【bzoj3240】 Noi2013—矩阵游戏

http://www.lydsy.com/JudgeOnline/problem.php?id=3240 (题目链接) 题意 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) 求解F[n][m],a,b,c,d为常数. Solution 原来费马小定理对于矩阵乘法同样适用..设a为一矩阵,p为质数则: 正好这里的模数1000000007为质数,那么把n,m模上(p-1)后进行矩阵快速幂即可.用来优化的矩阵很好构造,

bzoj3240: [Noi2013]矩阵游戏

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

【BZOJ】【3240】【NOI2013】矩阵游戏

十进制快速幂+矩阵乘法+常数优化 听说这题还可以强行算出来递推式……然后乘乘除除算出来…… 然而蒟蒻选择了一个比较暴力的做法= = 我们发现这个递推的过程是线性的,所以可以用矩阵乘法来表示,$x=a*x+b$这样一个递推式我们可以这样表示:$$\begin{bmatrix} x& 1 \end{bmatrix} * \begin{bmatrix} a& 0 \\ b& 1 \end{bmatrix} $$ 那么我们可以令$s_1$表示×a+b,$s_2$表示×c+d,那么我们有$$

bzoj1059:[ZJOI2007]矩阵游戏【二分图匹配】

Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种操作:行交换操作:选择矩阵的任意两行,交换这两行(即交换对应格子的颜色)列交换操作:选择矩阵的任意行列,交换这两列(即交换对应格子的颜色)游戏的目标,即通过若干次操作,使得方阵的主对角线(左上角到右下角的连线)上的格子均为黑色.对于某些关卡,小Q百思不得其解,以致他开始怀疑这些关卡是不是根本就是无

P1129 [ZJOI2007]矩阵游戏

洛谷—— P1129 [ZJOI2007]矩阵游戏 题目描述 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种操作: 行交换操作:选择矩阵的任意两行,交换这两行(即交换对应格子的颜色) 列交换操作:选择矩阵的任意两列,交换这两列(即交换对应格子的颜色) 游戏的目标,即通过若干次操作,使得方阵的主对角线(左上角到右下角的连线)上的格子均为黑色. 对于某些关卡,小Q百思不

1059: [ZJOI2007]矩阵游戏

1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2154  Solved: 1053[Submit][Status] Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种操作:行交换操作:选择矩阵的任意两行,交换这两行(即交换对应格子的颜色)列交换操作:选择矩