Avito Cool Challenge 2018-C. Colorful Bricks(數論)
阿新 • • 發佈:2018-12-24
題意: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; }