Codeforces Round439 C.The Intriguing Obsession

题目:
有三种颜色的点,每种各有a,b,c个,任意两点之间可以连线,但要求同种颜色的点距离不得小于3(一条线代表距离为1),求合法的连线方案数
分析:
哇,一开始以为这是个容斥,想了半天没思路
赛后一看,是个DP。。
1。首先同种颜色的点不能直接连,否则距离是1
2。然后同时观察两种颜色的点,比如红黄,每一个黄点至多连接1个红点,否则红点距离为2
3。也就是说,红黄之间的连线方案其实是红点到黄点的一个合法映射;合法的定义为:一个红点只能指向0个或1个黄点,一个黄点只能被0个或1个红点指向
4。F[x][y]代表x个红点,y个黄点的连接方案数
我们取一个特殊点(红点),那么F[x][y]=F[x-1][y]+y*F[x-1][y-1]
5。最终的答案为ab连线方案数×ac连线方案数×bc连线方案数,即F[a][b]×F[a][c]×F[b][c]
代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int Tmax=5005;
const long long MOD=998244353;
int a,b,c;
long long F[Tmax][Tmax];
long long dp(int x,int y)
{
    if(F[x][y]>0) return F[x][y];
    if(x==0||y==0) return F[x][y]=1;
    return F[x][y]=(dp(x-1,y)+(y*dp(x-1,y-1))%MOD)%MOD;
}
int main()
{
    scanf("%d%d%d",&a,&b,&c);
    if(a>b) swap(a,b);
    if(a>c) swap(a,c);
    if(b>c) swap(b,c);
    printf("%I64d",((dp(a,b)*dp(a,c))%MOD*dp(b,c))%MOD);
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值