bzoj1008 矩乘递推

2013-11-17 10:38

原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1008

比较水的题,直接矩阵乘法+递推就OK了

w[i,0]代表i个人不越狱的方案,

w[i,1]代表i个人越狱的方案,

那么有

w[i,1]:=w[i-1,0]+w[i-1,1]*m;

w[i,0]:=w[i-1,0]*(m-1);

然后用矩阵乘法加速。

然后我们可以发现,w[i,0]就是(m-1)^(i-2)*m

那么n个人,一共有n^m种方案,减去w[n,0]就好了

那么式子就是ans=m^n-m*(m-1)^(n-2)

//By BLADEVIL

const

    d39                         =100003;

     

type

    rec                         =array[0..2,0..2] of int64;

     

var

    n, m                        :int64;

    p                           :int64;

    ans, sum                    :rec;

    w                           :int64;

     

function mul(a,b:rec):rec;

var

    i, j, k                     :longint;

begin

    fillchar(mul,sizeof(mul),0);

    for i:=1 to 2 do

        for j:=1 to 2 do

            for k:=1 to 2 do mul[i,j]:=mul[i,j]+(a[i,k]*b[k,j]) mod d39;

end;

     

begin

    read(m,n);

    if n=1 then

    begin

        writeln(0);

        halt;

    end;

    ans[1,1]:=1; ans[2,2]:=1;

    sum[1,1]:=m-1; sum[1,2]:=1; sum[2,2]:=m;

    p:=n-2;

    while p<>0 do

    begin

        if p mod 2=1 then ans:=mul(ans,sum);

        p:=p div 2;

        sum:=mul(sum,sum);

    end;

    w:=((ans[1,2]*((m*m-m) mod d39) mod d39)+(ans[2,2]*m mod d39))mod d39;

    writeln(w);

end.

 

你可能感兴趣的:(ZOJ)