记录编号 72646 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOI 2013]矩阵游戏 最终得分 100
用户昵称 GravatarEzoi_XY 是否通过 通过
代码语言 Pascal 运行时间 5.724 s
提交时间 2013-10-18 18:46:32 内存使用 7.79 MiB
显示代码纯文本
Program cog1397;
    Const
        Moder=1000000007;
    Type
        Matrix=Array[1..2]Of Int64;
    Var
        N,M:Array[1..1000010]Of Longint;
        Mm,Mn:Matrix;
        A,B,C,D,Nl,Ml:Longint;
    Procedure Readin(Var A:Array Of Longint; Var L:Longint);
        Var
            C:Char;
            I:Longint;
        Begin
            L:=0;
            Read(C);
            Repeat
                Inc(L);
                A[L]:=Ord(C)-48;
                Read(C);
            Until C=' ';
            Dec(A[L]);
            For I:=L Downto 1 Do
                If A[I]<0
                    Then Begin
                             Inc(A[I],10);
                             Dec(A[I-1]);
                         End
                    Else Break;
        End;
    Function Matrixmul(A,B:Matrix):Matrix; Inline;
        Var
            S:Matrix;
        Begin
            S[1]:=A[1]*B[1] Mod Moder;
            S[2]:=(A[1]*B[2]+A[2]) Mod Moder;
            Exit(S);
        End;
    Function Matrixexp(A:Matrix; L:Longint; Var B:Array Of Longint):Matrix;
        Var
            S,T:Matrix;
            I:Longint;
        Begin
            S[1]:=1;
            S[2]:=0;
            While L<>0 Do
                Begin
                    T:=Matrixmul(A,A);
                    I:=B[L];
                    While I<>0 Do
                        Begin
                            If I And 1=1 Then S:=Matrixmul(S,A);
                            A:=Matrixmul(A,A);
                            I:=I Shr 1;
                        End;
                    A:=Matrixmul(T,T);
                    A:=Matrixmul(A,A);
                    A:=Matrixmul(A,T);
                    Dec(L);
                End;
            Exit(S);
        End;
    Begin
        Assign(Input,'matrixb.in');
        Assign(Output,'matrixb.out');
        Reset(Input);
        Rewrite(Output);
        Readin(N,Nl);
        Readin(M,Ml);
        Readln(A,B,C,D);
        Mm[1]:=A;
        Mm[2]:=B;
        Mn[1]:=C;
        Mn[2]:=D;
        Mm:=Matrixexp(Mm,Ml,M);
        Mn:=Matrixmul(Mm,Mn);
        Mn:=Matrixexp(Mn,Nl,N);
        Mn:=Matrixmul(Mn,Mm);
        Writeln((Mn[1]+Mn[2]) Mod Moder);
        Close(Input);
        Close(Output);
    End.