题目描述
监狱有连续编号为 1…N 的 N 个房间,每个房间关押一个犯人,有 M 种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱。
输入格式
输入两个整数 M,N
输出格式
可能越狱的状态数,模 100003 取余
- 一看就是组合数学
- 听说要用逆向思维,直接计算不好做
- 用所有情况数-相邻不同的情况数 => m^n - m*(m-1)^(n-1)
#include <bits/stdc++.h>
#define re register
#define il inline
using namespace std;
typedef long long ll;
const ll mod = 100003;
ll n, m;
ll mpow(ll a, ll b, ll mod) {
ll res = 1;
for(; b; b >>= 1, a=a*a%mod)
if(b&1) res = res*a%mod;
return res;
}
int main() {
scanf("%lld%lld",&m,&n);
printf( "%lld", ((mpow(m,n,mod)-m*mpow(m-1,n-1,mod))%mod+mod)%mod);
return 0;
}