其他分享
首页 > 其他分享> > [HNOI2008]越狱

[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