此题是一个较为经典的数学问题,首先有一个前置问题,由n个相同的括号可以组成多少个不同的括号串,这个数字其实就是一个卡特兰数,并且是卡特兰数的一个经典应用之一,关于卡特兰数的计算以及证明可以自行学习,在我们知道n个相同括号能够组成不同的括号串的个数之后,再来思考如果此时有k种括号任意使用,那么不同的括号串个数将会是原来的多少,其实不难看出在一个合法的括号串当中,其中任意一个配对的括号都可以置换成k种括号中的任意一种,并且在任意置换中括号穿都不会相同,所以显然括号串的数量将会扩充为原来的k^n^倍,所以n个k种类的括号任意组合最终不同的合法括号串数量即为n的卡特兰数*k^n^
mod = 998244353
N = 10010
d = [0] * N
n, k = map(int, input().split())
程序语言中有各种各样的括号,比如圆括号(),方括号[],花括号<>,等等。
如果一个括号串s满足下列三个条件中的至少一个,则我们认为该括号串是合法的。
1.该括号串是空串。
2.该括号串行如atb,其中a和b是一对可以匹配的括号(即a和b是同一种括号,且a为左括号b为右括号),而t是一个合法的括号。
3.该括号串形如t1t2,其中t和t2都是合法括号串。
例1:由条件2,()是合法的括号串。其中a=(,b=),t为空串。
例2:由条件2,<0>是合法的括号串,其中a=<,b=>,t=0。
例3:由条件3,[]<0>是合法的括号串,其中t1=[],t2=<0>。
例4:}{,()和))(不是合法的括号串。 现在给出可以使用的括号种类k,请你求出使用k括号可以组成几个长度为n的不同的合法括号串。
第一行有两个正整数,n(1<=n<=10000)和k(1<=k<=10)。其中n为括号串的长度,k为允许使用的括号种类。输入保证n为偶数
输出仅使用k括号可以组成几种长度为n的不同的合法括号串。因为答案很大,你只需要输出答案除以998244353所得的余数
输入
6 2
输出
40