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.

 

posted on 2013-11-20 14:35  BLADEVIL  阅读(241)  评论(0编辑  收藏  举报