广工校赛H哲哲的疑惑(组合数学)

题目链接:https://www.nowcoder.com/acm/contest/90/H
思路:这题的关键就是要理解C(k,m)的实际意义:从没有用到的颜色中挑出m个颜色,也就是一个颜色集合,按照题目的描述,是先选出一中染色方案再选出一种颜色集合,也就是说这两者之间只用满足一种关系就是染色方案中的颜色没有颜色属于这个颜色集合,那么我们就可以先选择颜色集合,然后确定染色方案,就是C(n,m) 构成一个颜色集合,然后染色方案中每个球有n-m中颜色可以选择ksm(n-m,l)
accode

#include<bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
using namespace std;
const int maxn  =  1e7+65;
const LL mod = 998244353;
LL n, m,l;
LL jie[maxn];
LL ksm(LL a,LL b)
{
    LL ret = 1;
    while(b)
    {
        if(b&1) ret = ret*a%mod%mod%mod;
        a = a%mod*a%mod%mod;
        b>>=1;
    }
    return ret%mod;
}
LL C(LL n,LL m)
{
    return jie[n]%mod*ksm(jie[n-m]%mod*jie[m]%mod%mod,mod-2)%mod%mod;
}
int main()
{
    jie[0] = jie[1] = 1;
    for(int i = 2;i<maxn;i++){
        jie[i] = jie[i-1]%mod*i%mod%mod;
    }
    scanf("%lld%lld%lld",&n,&m,&l);
    if(n<m){
        puts("0");
        return 0;
    }
    //cout<<C(3,2)<<endl;
    printf("%lld\n",C(n,m)%mod*ksm(n-m,l)%mod%mod);
}

猜你喜欢

转载自blog.csdn.net/w571523631/article/details/79686216