【HNOI2009】【BZOJ1008】越狱(组合,方案数,水题)
problem
- 有N个监狱(每个监狱一个犯人),编号1~N; 每个犯人有1种宗教信仰,编号1~M。
- 相邻房间的人如果信仰相同,就会越狱。
- 求可能发生越狱的方案数%100003。
solution
一、题解
- 考虑用总方案数减去不会越狱的方案数:
- 有m种信仰,n个监狱,那么总共有m^n的种方案数
- 不会越狱的方案数是。(这是因为第2~n个犯人信仰的宗教需要和上一个人不一样)
二、注意:
- 最后快速幂复杂度logn可水。
- 以及,记得开long long。
- 直接减有可能出现负数,所以得加上一个mod再减。
codes
#include<iostream>
#define mod 100003
using namespace std;
typedef long long LL;
LL pow(LL a, LL b){
if(!b)return 1;
LL t = pow(a, b/2)%mod;
return b%2==0 ? t*t%mod : t*t*a%mod;
}
int main(){
LL m, n; cin>>m>>n;
cout<<(pow(m,n)%mod-m*pow(m-1,n-1)%mod+mod)%mod<<"\n";
return 0;
}