C. Colorful Bricks
题目:
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
On his free time, Chouti likes doing some housework. He has got one new task, paint some bricks in the yard.
There are nn bricks lined in a row on the ground. Chouti has got mm paint buckets of different colors at hand, so he painted each brick in one of those mm colors.
Having finished painting all bricks, Chouti was satisfied. He stood back and decided to find something fun with these bricks. After some counting, he found there are kk bricks with a color different from the color of the brick on its left (the first brick is not counted, for sure).
So as usual, he needs your help in counting how many ways could he paint the bricks. Two ways of painting bricks are different if there is at least one brick painted in different colors in these two ways. Because the answer might be quite big, you only need to output the number of ways modulo 998244353998244353.
Input
The first and only line contains three integers nn, mm and kk (1≤n,m≤2000,0≤k≤n−11≤n,m≤2000,0≤k≤n−1) — the number of bricks, the number of colors, and the number of bricks, such that its color differs from the color of brick to the left of it.
Output
Print one integer — the number of ways to color bricks modulo 998244353998244353.
Examples
inputCopy
3 3 0
outputCopy
3
inputCopy
3 2 1
outputCopy
4
Note
In the first example, since k=0k=0, the color of every brick should be the same, so there will be exactly m=3m=3 ways to color the bricks.
In the second example, suppose the two colors in the buckets are yellow and lime, the following image shows all 44 possible colorings.
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define Mod 998244353
#define maxn 2010
long long dp[maxn][maxn];
int main()
{
int n,m,k;
cin >> n >> m >> k;
dp[1][0] = m;
for(int i = 2;i < n + 1;i++)
{
for(int j = 0;j < i;j++)
{
if(!j) dp[i][j] = dp[i - 1][j];
else dp[i][j] = (dp[i - 1][j] + dp[i - 1][j - 1] * (m - 1) % Mod) % Mod;
}
}
cout << dp[n][k] << endl;
return 0;
}
这是一道dp题(和高中学的排列组合有些相似),方程为:dp[i][j]=dp[i-1][j]+dp[i-1][j-1](M-1),这里dp数组需要开long long型,否则会输入超出。另外每次dp[i-1][j-1](M-1)都需要mod一下否则数据会超出。
接下来解释一下方程,i块砖j中不同砖的总数其实就是对最后一块砖进行讨论,如果到倒数第二块砖的总数已经满足j种,那么只要最后一块砖和倒数第二块砖的颜色相同就可以,如果到倒数第二块砖的总数还差一种,那只要满足最后一块砖与倒数第二块砖颜色不同即可。