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; }