监狱有连续编号为1…N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱
直接计算产生相邻的情况相当复杂,但发生相邻的情况数量等于总数量减去不相邻数量。不相邻数量可以按照如下方法构造:
第一个人有 m m 种可能,要不产生相邻则第二个人只有 种选择,第三个人也是,以此类推,总数为: m(m−1)(n−1) m ( m − 1 ) ( n − 1 ) 。而总的排列数量为: nm n m 。
#ifdef LOCAL
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#else
#include <bits/stdc++.h>
#endif
#define INF 0x7FFFFFFF
using namespace std;
typedef long long LL;
inline void read(LL&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
namespace QuickPower {
const LL MOD = 100003;
inline LL pow(const LL x, const LL n) {
LL ans = 1;
for (LL num = x % MOD, k = n; k; num = num * num % MOD, k >>= 1) if (k & 1) ans = ans * num % MOD;
return ans;
}
}
int main() {
#ifdef LOCAL
freopen("input.txt", "r", stdin);
#endif
LL M, N;
while (~scanf("%lld%lld", &M, &N)) {
LL ans = QuickPower::pow(M, N) - QuickPower::pow(M-1, N-1)*M;
printf("%lld\n", (ans%QuickPower::MOD+QuickPower::MOD)%QuickPower::MOD);
}
return 0;
}