Problem:
Score : 500 points

Problem Statement

There are N blocks arranged in a row. Let us paint these blocks.

We will consider two ways to paint the blocks different if and only if there is a block painted in different colors in those two ways.

Find the number of ways to paint the blocks under the following conditions:

For each block, use one of the M colors, Color 1 through Color M, to paint it. It is not mandatory to use all the colors.

There may be at most K pairs of adjacent blocks that are painted in the same color.

Since the count may be enormous, print it modulo 998244353.

Constraints

All values in input are integers.

1 \leq N, M \leq 2 \times 10^5

0 \leq K \leq N - 1

Input

Input is given from Standard Input in the following format:

N M K

Output

Print the answer.

Sample Input 1

3 2 1

Sample Output 1

6

The following ways to paint the blocks satisfy the conditions: 112, 121, 122, 211, 212, and 221. Here, digits represent the colors of the blocks.

Sample Input 2

100 100 0

Sample Output 2

73074801

Sample Input 3

60522 114575 7559

Sample Output 3

479519525

Solution in OCaml (4.10.0) (judge verdict: Accepted)

Scanf.scanf "%d %d %d" (fun n m k ->
    let extgcd x y =
        let rec eg r0 r1 a0 a1 b0 b1 =
            if r1 = 0 then a0 else
                let q1 = r0 / r1 in
                eg r1 (r0 mod r1) a1 (a0 - q1 * a1) b1 (b0 - q1 * b1)
        in
        eg x y 1 0 0 1
    in
    let inv x y = (* 1/x in mod y *)
        let c = extgcd x y in
        if c < 0 then c + y else c
    in
    let mm = 998244353 in
    let ( +@) a b = (a + b) mod mm in
    let ( *@) a b = (a * b) mod mm in
    let ( /@) a b = a *@ inv b mm in

    let modpow a b =
        let rec loop r bit acc =
            if bit = 0 then acc else
                loop (r *@ r) (bit lsr 1) (if bit land 1 = 0 then acc else acc *@ r)
        in
        loop a b 1
    in

    let rec loop cur over single acc =
        let acc = acc +@ cur in
        if single > k then acc else
            let cur = cur *@ over /@ (single *@ (m - 1)) in
            loop cur (over - 1) (single + 1) acc
    in
    (if m = 1 && k = n - 1 then 1 else
        loop (m *@ modpow (m - 1) (n - 1)) (n - 1) 1 0) |> Printf.printf "%d\n"
)