Codeforces Round439 C.The Intriguing Obsession

来源:互联网 发布:网络运营托管 编辑:程序博客网 时间:2024/05/29 13:22

题目:
有三种颜色的点,每种各有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 0
原创粉丝点击