[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.