思路:
考虑用总方案数-不合法方案数
总数为
m
n
m^n
mn
不合法的方案数即相邻的人不存在饭菜相同的情况,
数量为
m
∗
(
m
−
1
)
n
−
1
m*(m-1)^{n-1}
m∗(m−1)n−1,即第一个人任选一种,
后面每个人都相对于前一个人而言有
m
−
1
m-1
m−1种选择
a
n
s
=
m
n
−
m
∗
(
m
−
1
)
n
−
1
ans=m^n-m*(m-1)^{n-1}
ans=mn−m∗(m−1)n−1
快速幂计算即可,注意取模,
相乘溢出以及负数的考虑(我就被这可卡到80分)
#include <cstdio>
#include <iostream>
using namespace std;
typedef long long ll;
const ll mod = 100003;
ll n, m;
ll ksm(ll a, ll n, ll m)
{
if(n == 0) return 1;
ll x = ksm(a, n / 2, m);
ll ans = x * x % m;
if(n % 2 == 1) ans = ans * a % m;
return ans;
}
int main()
{
scanf("%lld%lld", &m, &n);
printf("%lld\n", (ksm(m, n, mod) % mod - m % mod * ksm(m - 1, n - 1, mod) % mod+mod) % mod);
return 0;
}