题目描述
监狱有连续编号为 1…N1\dots N1…N 的 NNN 个房间,每个房间关押一个犯人,有 MMM 种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱。1≤M≤1081\le M\le 10^81≤M≤108,1≤N≤10121\le N\le 10^{12}1≤N≤1012。
算法分析
考虑补集转化,总方案数为 mnm^nmn 减去任意两个相邻房间的犯人宗教不相同的方案数,即第一个房间可以任意选择宗教信仰,此后每个房间犯人的宗教信仰只需和前一个不同即可,为 m×(m−1)n−1m\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;
}
本文探讨了一个关于监狱中犯人信仰宗教导致越狱风险的数学问题,通过补集转化法,计算在特定条件下可能发生越狱的状态总数。利用快速幂算法优化计算过程,适用于大规模数据处理。

527

被折叠的 条评论
为什么被折叠?



