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 PHP (7.4.4) (judge verdict: Wrong Answer)

<?php

define("MOD", 998244353);

while ($stdin = fgets(STDIN)) {
    $line[] = trim($stdin);
}
foreach ($line as $key => $value) {
    $data[] = explode(' ', $value);
}

foreach ($data as &$line) {
    $line = array_map(function($val) { return (int)$val; }, $line);
}

$N = $data[0][0];
$M = $data[0][1];
$K = $data[0][2];

var_dump(modPow(1000,10000,MOD));

prepareMod($N - 1);
$num = 0;
for ($i = 0; $i <= $K; $i++) {
    $add = MintMul(nCm($N - 1, $i), $M);
    $add = MintMul($add, modPow(($M-1), $N - $i - 1, MOD));
    $num = MintAdd($num, $add);
}
$ans = $num;

printf('%d', $ans);


/**
 * とても高速なnCm関数です
 *  prepareModで事前計算しておき、
 *  nCmを呼び出しましょう。
 *  AtCoderの2秒制約ならN=10^6ぐらいまで通ります
 */
 
function prepareMod($n){
    global $f, $invf;
    $f[0] = $invf[0] = $invf[1] = 1;
    for($i = 1; $i <= $n; $i++)$f[$i] = $f[$i-1]*$i%MOD;
    for($i = 2; $i <= $n; $i++)$invf[$i] = (MOD - intdiv(MOD, $i))*$invf[MOD%$i]%MOD;
    for($i = 2; $i <= $n; $i++)$invf[$i] = $invf[$i]*$invf[$i-1]%MOD;
}
function nHm($n, $m){
    global $f, $invf;
    return nCm($n+$m-1, $m);
}
function nCm($n, $m){
    global $f, $invf;
    if($n < 0 || $n - $m < 0)return 0;
    return $f[$n] * $invf[$n-$m] % MOD * $invf[$m] % MOD;
}

//============================================================
// 素数を法とした値を出す用
//============================================================
 
function MintInit(int $a) {
	return(($a % MOD + MOD) % MOD);
}
 
function MintAdd(int $a, int $b) {
	return(MintInit($a + $b));
}
 
function MintSub(int $a, int $b) {
	return(MintInit($a - $b));
}
 
function MintMul(int $a, int $b) {
	return(MintInit($a * $b));
}
 
function MintDiv(int $a, int $b) {
	return(MintMul($a, modPow($b, mod - 2, mod)));
}
//============================================================
 
// 繰り返し二乗法
function modPow(int $a, int $n, int $p) {
	if($n == 1) {
		return($a % $p);
	}
	if($n % 2 == 1) {
		return(($a * modPow($a, $n - 1, $p)) % $p);
	}
	
	$t = modPow($a, $n / 2, $p);
	return(($t * $t) % $p);
}