BZOJ 1008: [HNOI2008] 越狱 数学 快速幂
思路:思考总数 - 合法的状态数(即邻房间的犯人的宗教不相同);
因为每个牢房的犯人都可以信仰 m 种 宗教,所以说一共有 mn 种组合。
当一个牢房的犯人信仰一种宗教后,相邻的牢房的犯人只可以信仰 剩下的 m-1种 中的一种 才不会越狱,即:
所以说 这是
m∗(m−1)n−1
种;
所以说答案就是
mn−m∗(m−1)n−1
因为我们在过程中mod 过,减出来可能为负,我们需要 (ans + mod)%mod
代码:
#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long LL;
const int mod = 100003;
LL ksm(LL a, LL p)
{
LL ans = 1;
for( ; p; p >>= 1, a = (a%mod * a%mod)%mod)
if(p&1)
ans = (ans%mod * a%mod)%mod;
return ans%mod;
}
int main()
{
LL m, n;
cin >> m >> n;
LL ans = ksm(m,n) - (m%mod * ksm(m-1,n-1))%mod;
printf("%lld",(ans+mod)%mod);
return 0;
}