[BZOJ1008][HNOI2008]越狱

第一次写题解,(⊙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.





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值