BZOJ1008:[HNOI2008]越狱——题解

https://www.lydsy.com/JudgeOnline/problem.php?id=1008

监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱

正难则反(反正我没想到,定式思维想求发生越狱结果根本求不出来orz)

m^n是总状态数。

不发生越狱时,第一个人可以选m个宗教,往后所有人只能选n-1个宗教。

所以答案为m^n-m*(m-1)^(n-1)

#include<cstdio>
#include<cctype>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll p=100003;
ll qpow(ll k,ll n){
    ll res=1;
    while(n){
    if(n&1)res=res*k%p;
    k=k*k%p;
    n>>=1;
    }
    return res;
}
ll m,n;
int main(){
    scanf("%lld%lld",&m,&n);
    printf("%lld\n",((qpow(m,n)-m*qpow(m-1,n-1)%p)%p+p)%p);
    return 0;
}
posted @ 2018-05-05 09:50  luyouqi233  阅读(125)  评论(0编辑  收藏  举报