[HNOI2008]越狱
Description
Solution
正向考虑需要去重,反向考虑:如果每个相邻的人宗教都不同,对于第一个位置有\(m\)种选择,第二个位置有\(m-1\)个选择,第三个位置也有\(m-1\)个选择......由此可知方案数为\(m\cdot (m-1)^{n-1}\)。又有总方案数为\(m^n\),所以所求方案数为\(m^n-m\cdot (m-1)^{n-1}\)。
小优化:快速幂可以用费马小定理加速(44ms->8ms)
Code
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
typedef long long LL;
const LL MOD = 100003;
LL n, m;
inline LL pow_mod(LL x, LL p, LL mod) {
x %= mod;
p %= mod-1; // 费马小定理
LL ans = 1;
for (; p; p >>= 1) {
if (p & 1) ans = ans * x % mod;
x = x * x % mod;
}
return ans;
}
int main() {
std::cin >> m >> n;
std::cout << (pow_mod(m, n, MOD) - m % MOD * pow_mod(m-1, n-1, MOD) % MOD + MOD) % MOD;
return 0;
}