Description

监狱有连续编号为 \(1, 2, ..., n\)\(n\) 个房间, 每个房间关押一个犯人, 有 \(m\) 种宗教, 每个犯人可能信仰其中一种. 如果相邻房间的犯人的宗教相同, 就可能发生越狱, 求有多少种状态可能发生越狱

Input

输入两个整数 \(m, n\).\(1 \leq m \leq 10^8, 1 \leq n \leq 10^{12}\)

Output

可能越狱的状态数, 模 \(100003\) 取余

Sample Input

2 3

Sample Output

6

Explanation

如果我们从另一个方面想问题, 就是说所有的排列方法, 减去相邻两个不同的方法数:

所有的排列方法数为 \(m^n\) 种, 而相邻不同的方法数为: 考虑第一个位置有 \(m\) 种涂法, 从第二个位置开始起, 每一个位置只是不能涂前一种颜色, 所以有 \(m-1\) 种涂法, 固然, 总的会发生事故的方案数为:

\[m^n - (m-1)^{n-1}\]

然后简单快速幂瞎搞一发就可以了.

Source Code


#include <iostream>
#include <cstdlib>
#include <cstdio>

using namespace std;
typedef long long lli;
const int maxn = 10010;
const lli modr = 100003;

lli power(lli a, lli b) {
    lli x = a, res = 1;
    for (lli i = 0; i < 64; i++) {
        if (b & (1ll << i)) res = res * x % modr;
        x = x * x % modr;
    } return res; }

lli n, m;

int main(int argc, char** argv)
{
    scanf("%lld%lld", &m, &n);
    lli res = (power(m, n) + modr - m * power(m - 1, n - 1) % modr) % modr;
    printf("%lld\n", res);
    return 0;
}