• 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.
    View Code



  • 相关阅读:
    mapcontrol的鼠标样式
    SQL SERVER数据类型与C#数据类型对照表
    正则表达式基元
    WPF中UserControl和DataTemplate
    [转]SQL三种获取自增长的ID方法
    [转]SQL Server 存储过程 一些常用用法(事物、异常捕捉、循环)
    Learn JavaScript(面向对象的程序设计01)
    CLR:基元类型、引用类型和值类型
    grid layout 相关代码
    css关于position的几个值
  • 原文地址:https://www.cnblogs.com/Randolph87/p/3789063.html
Copyright © 2020-2023  润新知