题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1618
思路:
总方案数为 m ∗ m ∗ … ∗ m = m n m*m*…*m=m^n m∗m∗…∗m=mn
不发生越狱的方案数为 m ∗ ( m − 1 ) ∗ . . . ∗ ( m − 1 ) = m ∗ ( m − 1 ) n − 1 m*(m-1)*...*(m-1) = m*(m-1)^{n-1} m∗(m−1)∗...∗(m−1)=m∗(m−1)n−1
故发生越狱的方案数为 m n − m ∗ ( m − 1 ) n − 1 m^n-m*(m-1)^{n-1} mn−m∗(m−1)n−1。
对答案取余 ( m n − m ∗ ( m − 1 ) n − 1 ) % m o d (m^n-m*(m-1)^{n-1}) \ \% \ mod (mn−m∗(m−1)n−1) % mod,即 ( m n % m o d − m ∗ ( m − 1 ) n − 1 % m o d ) % m o d (m^n \ \% \ mod - m*(m-1)^{n-1} \ \% \ mod) \ \% \ mod (mn % mod−m∗(m−1)n−1 % mod) % mod,
但是 m n % m o d m^n \ \% \ mod mn % mod 减去 m ∗ ( m − 1 ) n − 1 % m o d m*(m-1)^{n-1} \ \% \ mod m∗(m−1)n−1 % mod 可能是负数,
所以还需要把负余数转换成正余数,即 ( m n % m o d − m ∗ ( m − 1 ) n − 1 % m o d + m o d ) % m o d (m^n \ \% \ mod - m*(m-1)^{n-1} \ \% \ mod + mod) \ \% \ mod (mn % mod−m∗(m−1)n−1 % mod+mod) % mod。
#include <iostream>
using namespace std;
typedef long long ll;
const int mod = 100003;
int qmi(int a, ll b, int m)
{
int res = 1;
while (b)
{
if (b & 1) res = (ll)res * a % m;
a = (ll)a * a % m;
b >>= 1;
}
return res;
}
int main()
{
int m;
ll n;
cin >> m >> n;
cout << (qmi(m, n, mod) - (ll)m * qmi(m - 1, n - 1, mod) % mod + mod) % mod << endl;
return 0;
}