Codeforces Round #439 C. The Intriguing Obsession

Posted ljy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #439 C. The Intriguing Obsession相关的知识,希望对你有一定的参考价值。

题意:给你三种不同颜色的点,每种若干(小于5000),在这些点中连线,要求同色的点的最短路大于等于3或者不连通,求有多少种连法。

 

Examples
Input
1 1 1
Output
8
Input
1 2 2
Output
63
Input
1 3 5
Output
3264
Input
6 2 9
Output
813023575

思路:从第一个样例来看点与点之间是可以不连通的,而且题目要求同色点的最短路大于等于3,也就是说两个同色的点不能连到同一点
    上去。仔细想想,每个点是不影响整体的合法性的,也就是说如果整体是合法的,去掉其中一个点以及它连的线是合法的,加上一
    个合法连线的点也是合法的。所以我们可以算出每种颜色互相连的方案数然后乘起来就行了。
    这里算方案数的时候,是取两种颜色的点的个数x,y的最小值mi,然后i从0到mi,ans+=C[x][i]*C[y][i]*阶乘(i)
    相当于是一个排列组合吧23333.

代码:
#include<iostream>
#include<algorithm>
using namespace std;

const int mod=998244353;
const int maxn=5005;
int C[maxn][maxn],f[maxn],a,b,c;

void init(){
    f[0]=1;
    for(int i=1;i<=maxn;i++){
        f[i]=1LL*f[i-1]*i%mod;
        C[i][0]=1;
    }
    C[0][0]=1;
    for(int i=1;i<=maxn;i++){
        C[i][i]=1;
        for(int j=1;j<i;j++){
            C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
        }
    }
}

int solve(int x,int y){
    int mi=min(x,y),ans=0;
    for(int i=0;i<=mi;i++){
        ans=(ans+((1LL*C[x][i]*C[y][i])%mod*f[i])%mod)%mod;
    }
    return ans;
}
int main(){
    init();
    cin>>a>>b>>c;
    int ans1=solve(a,b),ans2=solve(a,c),ans3=solve(b,c);
    int sum=(((1LL*ans1*ans2)%mod)*ans3)%mod;
    cout<<sum<<endl;
    return 0;
}

以上是关于Codeforces Round #439 C. The Intriguing Obsession的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #439 (Div. 2)(ABC)

Codeforces Round #439 (Div. 2) Problem B (Codeforces 869B)

Codeforces Round #439 (Div. 2) Problem A (Codeforces 869A) - 暴力

Codeforces Round #439 (Div. 2) Problem C (Codeforces 869C) - 组合数学

Codeforces Round #439 (Div. 2)

C - The Intriguing Obsession /* Codeforces Round #439 */ (dp )