#排列组合#CF1081C Colorful Bricks 题目 分析 代码

一共 (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);
}