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 C# (.NET Core 3.1.201) (judge verdict: Time Limit Exceeded)

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp32
{
    class Program
    {
        static void Main(string[] args)
        {
            var buff = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();

            int N = buff[0];
            int M = buff[1];
            int K = buff[2];
            const int mod = 998244353;

            var list = Pattern(N, K, mod);
            long ans = 0;
            for(int i = 0; i <= K; i++)
            {
                ans += Paint(i, list[i], N, M, mod);
                ans %= mod;
            }

            Console.WriteLine(ans);

        }

        static List<long> Pattern(int N, int K, int mod)
        {
            var list = new List<long>();
            list.Add(1);
            var factreal = new List<long>();
            factreal = Factreal(K, mod);
            for(int i = 1; i <= K; i++)
            {
                long value = 1;
                for(int j = 1; j <= i; j++)
                {
                    value *= (N - j);
                    value %= mod;
                }
                value *= Modinv(factreal[i - 1], mod);
                value %= mod;
                list.Add(value);
            }
            return list;
        }

        static long Paint(long n_same, long pattern, int N, int M, int mod)
        {
            long value = M;
            for(int i = 1; i < N - n_same; i++)
            {
                value *= M - 1;
                value %= mod;
            }
            value *= pattern;

            return value;
        }

        static List<long> Factreal(long a, long mod)
        {
            var list = new List<long>();
            long value = 1;
            int i = 1;
            while(i <= a)
            {
                value *= i++;
                value %= mod;
                list.Add(value);
            }
            return list;
        }

        static long Modinv(long a, long m)
        {
            long b = m;
            long u = 1;
            long v = 0;
            while (b != 0)
            {
                long t = a / b;
                a -= t * b;
                (a, b) = Swap(a, b);
                u -= t * v;
                (u, v) = Swap(u, v);
            }
            u %= m;
            if(u < 0)
            {
                u += m;
            }
            return u;
        }

        static (long a, long b) Swap(long a, long b)
        {
            long temp = a;
            a = b;
            b = temp;

            return (a, b);
        }
    }
}