Avito Cool Challenge 2018-C. Colorful Bricks(数论)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/sugarbliss/article/details/85056804
今日推荐