題目描述
監獄有連續編號爲 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;
}