[HNOI2008]越狱
作者:互联网
洛咕
题意:监狱有连续编号为1…N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱?
分析:直接计算越狱的方案数不是很好做,所以考虑用总方案数减去不越狱的方案数得到答案.
每个房间的宗教有m种可能,有n个房间,则总方案数等于\(m^n\).相邻的两个房间宗教相同时就会越狱,所以不会越狱的方案数为\(m \times (m-1)^{n-1}\),这是因为第一个房间的宗教有m种选择,则第二个房间的宗教有m−1种(不能选第一个房间的那个宗教)选择,第三个房间的罪犯的宗教有m−1种(不能选第二个房间的那个宗教)选择,以此类推,后面的房间都是m-1中可能的选择.
因此越狱的方案数就有\(m^n-m \times (m-1)^{n-1}\)种.一个快速幂就好了.
#include<bits/stdc++.h>
#define LL long long
using namespace std;
inline LL read(){
LL s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
return s*w;
}
const LL mod=100003;
inline LL ksm(LL a,LL b){
LL cnt=1;
while(b){
if(b&1)cnt=(cnt*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return cnt%mod;
}
int main(){
LL m=read(),n=read();
printf("%lld\n",(ksm(m,n)-((m*ksm(m-1,n-1))%mod)+mod)%mod);
//记得加上一个mod,否则可能变成了负数
return 0;
}
标签:ch,LL,房间,越狱,HNOI2008,宗教,mod 来源: https://www.cnblogs.com/PPXppx/p/10658675.html