题目描述
监狱有连续编号为 1 … N 1\dots N 1…N 的 N N N 个房间,每个房间关押一个犯人,有 M M M 种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱。 1 ≤ M ≤ 1 0 8 1\le M\le 10^8 1≤M≤108, 1 ≤ N ≤ 1 0 12 1\le N\le 10^{12} 1≤N≤1012。
算法分析
考虑补集转化,总方案数为 m n m^n mn 减去任意两个相邻房间的犯人宗教不相同的方案数,即第一个房间可以任意选择宗教信仰,此后每个房间犯人的宗教信仰只需和前一个不同即可,为 m × ( m − 1 ) n − 1 m\times (m-1)^{n-1} m×(m−1)n−1。
代码实现
#include <cstdio>
typedef long long int ll;
const int mod=100003;
inline int dec(int x,int y) {x-=y;return x<0?x+mod:x;}
inline int mul(int x,int y) {return (ll)x*y%mod;}
inline int qpow(int n,ll k) {
int ans=1;
while(k) {if(k&1) ans=mul(ans,n);n=mul(n,n);k>>=1;}
return ans;
}
int main() {
int m;ll n;scanf("%d%lld",&m,&n);
printf("%d\n",dec(qpow(m,n),mul(m,qpow(m-1,n-1))));
return 0;
}