题目
一共 (n) 块砖排成一排,把每块砖涂成 (m) 种颜色中的一种,
其中恰有 (k) 块颜色与其左边的那块砖不同(不包括第一块),问涂色方案数,对 (998244353) 取模。
分析
先钦定第一块的颜色,题意也就是分为(k+1)个颜色段,
这可以用隔板法实现,也就是(C(n-1,k))
然后后面(k)段就可以在剩余(m-1)种颜色中选择,
所以最后答案就是(m*C(n-1,k)*(m-1)^k)
代码
#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
const int mod=998244353;
inline signed ksm(int x,int y){
rr int ans=1;
for (;y;y>>=1,x=1ll*x*x%mod)
if (y&1) ans=1ll*ans*x%mod;
return ans;
}
inline signed C(int n,int m){
rr int mn=m<n-m?m:n-m,mx=n-mn;
rr int ans0=1,ans1=1,ans=1;
for (rr int i=1;i<=n;++i){
ans=1ll*ans*i%mod;
if (mn==i) ans0=ksm(ans,mod-2);
if (mx==i) ans1=ksm(ans,mod-2);
}
return 1ll*ans*ans0%mod*ans1%mod;
}
signed main(){
rr int n,m,k; scanf("%d%d%d",&n,&m,&k);
return !printf("%d",1ll*m*ksm(m-1,k)%mod*C(n-1,k)%mod);
}