第一次写题解,(⊙o⊙)
题目大意:
监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱
这道题目可以反着想,有多少种可能不发生越狱。很明显,当每一个人都与前一个房间人信仰不同时,不会发生越狱,即有M*(M-1)^(N-1)种可能不越狱,而共有M^N种不同的可能,因此结果为M^N-M*(M-1)^(N-1)
注意到数据为
1<=M<=10^8,1<=N<=10^12
且结果
模100003取余
因此用快速幂算出结果即可
代码如下:
var n,m,ans,tot:int64;
procedure exp(a,b:int64; var res:int64);
begin
while (b>0) do begin
if (b mod 2=1) then res:=(res*a) mod 100003;
b:=b div 2;
a:=(a*a) mod 100003;
end;
end;
begin
readln(m,n); ans:=1; tot:=m;
exp(m,n,ans);
exp(m-1,n-1,tot);
writeln((ans+100003-tot) mod 100003);
end.