[BZOJ1008] [HNOI2008]越狱

Description

  监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱

 

 

  这道题其实就是再简单不过的排列组合应用。

  就是总数减去相邻颜色不同的种类数。

  mn-m*(m-1)n-1

  实际上是没有什么好讲的...但是刚开始花了很久的时间写了一个错误的代码

  由于数据很大...而且在BZOJ上做的前几题给了我”题目一定不会让你水过“的印象,所以第一反应是矩乘。

  往那个方向想之后就推出一个容斥的式子,然后搞了半天居然生平第一次构造出了矩阵!

  类似于设w[i]=mi g[i]=i*mi f[i]=sigma(g[j])(j<=i)(这里的wi带符号,分n的奇偶性讨论)

 

  然后似乎负数取模还搞了很久...

  最后发现这种容斥根本就是错的...还多计算了其他不相邻位置的方案数。

 

program bzoj1008;
const tt=100003;
var n,m,ans:int64;

function mul(a,b:int64):int64;
var ans,w:int64;
begin
    ans:=1;w:=a mod tt;
    while b<>0 do 
    begin
        if b and 1=1 then ans:=(ans*w) mod tt;
        w:=(w*w) mod tt;
        b:=b >> 1;
    end;
    exit(ans);
end;

begin
    readln(m,n);
    m:=m mod tt;
    ans:=mul(m,n)-m*mul(m-1,n-1);
    if ans<0 then ans:=ans+((-ans) div tt+1)*tt;
    writeln(ans mod tt);
end.

 

 

 

posted @ 2015-04-08 16:31  mjy0724  阅读(75)  评论(0编辑  收藏