版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sugarbliss/article/details/85056804
题意:1*n的格子 可以用m种颜色涂色,已知从第2开始到第n个格子,有k个格子与其左边的格子颜色不同求涂色的方案数。
思路:相当于把n个格子分成k+1份隔板法直接求得C(n-1,k)种方案,然后直接涂色第一块可以涂m种颜色,其余的都要去掉左边那一块的颜色,所以只有 m-1种可能,即 m*(m-1)*(m-1)*......*(m-1) ;。
所以C(n-1,k)*m*(m-1)^k。注意取模。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 2e3+10;
const ll mod = 998244353;
ll c[maxn][maxn];
ll qpow(ll a, ll b)
{
ll ans = 1;
while(b)
{
if(b & 1) ans = (ans * a) % mod;
a = (a * a) % mod;
b >>= 1;
}
return ans;
}
void get_c(ll x)
{
c[0][0] = 1;
for(int i = 1; i <= x; i++)
{
c[i][0] = 1;
for(int j = 1; j <= i; j++)
c[i][j] = (c[i-1][j]+c[i-1][j-1])%mod;
}
}
int main()
{
ll n, m, k;
cin >> n >> m >> k;
get_c(n); ll ans = 1LL;
ans = (m%mod*c[n-1][k]%mod*qpow(m-1LL, k)%mod + mod)%mod;
cout << ans << endl;
return 0;
}