1. 程式人生 > >Avito Cool Challenge 2018-C. Colorful Bricks(數論)

Avito Cool Challenge 2018-C. Colorful Bricks(數論)

題意: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;
}