1 条题解

  • 0
    @ 2025-3-28 13:43:03

    本题的大意是一共有N个放格排列,每一个排列都可以有M种颜色,需要求解涂有相同颜色的对数不超过K对,可以考虑从N个中选择i个相邻的元素是一样的,这个i的范围是从0~k,之后可以发现第一个一定是M种选择,剩下的不同颜色的选择是(M1)(N1i)(M-1)^(N-1-i)需要注意的是除法没有取模,所以需要使用到逆元

    #include<cstdio>
    #include<iostream>
    #include<vector>
    #include<map>
    #include<cstring>
    #include<array>
    #include<queue>
    #include<algorithm>
    #include<set>
    #include<cmath>
    using namespace std;
    using i64=long long;
    //using i128=__int128;
    //const i64 INF=1e18;
    const int mod=998244353;
    //const int N=1e9+7;
    const int N=2e5+10;
    i64 fact[N],invfact[N];
    i64 qmi(i64 a,i64 b){
        i64 res=1;
        while(b){
            if(b&1)res=res*a%mod;
            a=a*a%mod;
            b>>=1;
        }
        return res;
    }
    void init(){
        fact[0]=invfact[0]=1;
        for(int i=1;i<=N;i++)fact[i]=i*fact[i-1]%mod;
        invfact[N]=qmi(fact[N],mod-2)%mod;
        for(int i=N-1;i>=0;i--){
            invfact[i]=invfact[i+1]*(i+1)%mod;
        }
    }
    void solve(){
        int n,m,k;
        cin>>n>>m>>k;
        i64 ans=0;
        for(int i=0;i<=k;i++){
            if(n-i-1<0)break;
            ans=(ans+m*qmi(m-1,n-i-1)%mod*fact[n-1]%mod*invfact[i]%mod*invfact[n-i-1]%mod)%mod;
        }
        cout<<ans<<'\n';
    }
    int main(){
        init();
        int _=1;
        //cin>>_;
        while(_--)solve();
        return 0;
    }
    

    信息

    ID
    289
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    42
    已通过
    9
    上传者