当前位置: 首页 > news >正文

Codeforces Round #439 (Div. 2) C.The Intriguing Obsession(组合数、记忆化搜索)

题意:

给出a个红色点,b个蓝色点,c个紫色点,我们可以在这些点之间连任意数量长度为1的边,但是限制同颜色的点之间不能连边且同颜色的点之间的最短路径至少为3,求方案数% 998244353, a,b,c<=5000

思路:

分析最短路径至少为3代表当前颜色的点不能向其它两个颜色相同的点进行连边,并且每两组颜色之间的连边是不受另外一组颜色的影响的,所以最后把三种分组乘起来即可。那么对于一组(a,b),其中a<=b,当前组的连边情况能连0,1,2...a条边,假如要连i条边,那么其选择就是C(m, 1)*C(m-1, 1)*..*C(m-i+1, 1)。再把所有连边情况加起来就是当前分组的所有情况,公式:Σ[i∈(0, a)]C(a, i)* (b!/(b-i)!)。

其实也可以用记忆化搜索做,内存恰好够。

代码1:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod = 998244353;
const int maxn = 5005;
ll fac[maxn], inv[maxn], fiv[maxn], ans, tmp;
void init()
{
	fac[0] = fac[1] = 1;
	inv[1] = 1;
	fiv[0] = fiv[1] = 1;
	for(int i = 2; i <= 5000; ++i)
	{
		fac[i] = fac[i-1]*i%mod;
		inv[i] = (-mod/i+mod)*inv[mod%i]%mod;
		fiv[i] = fiv[i-1]*inv[i]%mod;
	}
}
int main()
{
	int a, b, c, rx, ry;
	init(); ans = 1;
	cin >> a >> b >> c;
	rx = a, ry = b, tmp = 0;
	if(rx > ry) swap(rx, ry);
	for(int i = 0; i <= rx; ++i)
	{
		tmp += fac[rx]*fiv[i]%mod*fiv[rx-i]%mod*fac[ry]%mod*fiv[ry-i]%mod;
		tmp %= mod;
	}
	ans = ans*tmp%mod;
	
	rx = a, ry = c, tmp = 0;
	if(rx > ry) swap(rx, ry);
	for(int i = 0; i <= rx; ++i)
	{
		tmp += fac[rx]*fiv[i]%mod*fiv[rx-i]%mod*fac[ry]%mod*fiv[ry-i]%mod;
		tmp %= mod;
	}
	ans = ans*tmp%mod;
	
	rx = b, ry = c, tmp = 0;
	if(rx > ry) swap(rx, ry);
	for(int i = 0; i <= rx; ++i)
	{
		tmp += fac[rx]*fiv[i]%mod*fiv[rx-i]%mod*fac[ry]%mod*fiv[ry-i]%mod;
		tmp %= mod;
	}
	ans = ans*tmp%mod;
	
	cout << ans << endl;
	return 0;
}


代码2:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod = 998244353;
const int maxn = 5005;
ll dp[maxn][maxn];
ll work(int x, int y)
{
	if(!x || !y) return 1;
	if(dp[x][y]) return dp[x][y];
	return dp[x][y]=(work(x-1, y-1)*y%mod + work(x-1, y))%mod;
}
int main()
{
	int a, b, c;
	cin >> a >> b >> c;
	printf("%I64d\n", work(min(a, b), max(a, b))*work(min(a, c), max(a, c))%mod*work(min(b, c), max(b, c))%mod);
	return 0;
}


继续加油~

相关文章:

  • (第一天)包装对象、作用域、创建对象
  • UOJ-79 一般图的最大匹配(带花树模板求解)
  • POJ-2823 POJ-3250 (单调队列 单调栈)
  • 关于量价十八则的口诀
  • HDU-3478 Catch(二分图染色+并查集)
  • RSA密钥的生成与配置
  • POJ 2536 Gopher II
  • HDU-1043 Eight(经典八数码问题, A*+康拓+曼哈顿距离+逆序数判断可解性、双向搜索)
  • codeforces-510E Fox And Dinner(带限制的二分图多重匹配+奇偶建图+打印路径)
  • C-Cleaning Pipes(判断两线段相交+二分图判定) 2015-2016 Northwestern European Regional Contest (NWERC 2015)
  • eclipse the user operation is waiting for building workspace to complete
  • 2-SAT 题目整理
  • 64位windows2003 未在本地计算机上注册 microsoft.jet.oledb.4.0 提供程序
  • HDU-5950 Recursive sequence(矩阵乘法)
  • “互联网+”引发IT人才招工荒-新华网安徽频道
  • 5、React组件事件详解
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • Intervention/image 图片处理扩展包的安装和使用
  • iOS 颜色设置看我就够了
  • java概述
  • js递归,无限分级树形折叠菜单
  • Less 日常用法
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • SpringCloud集成分布式事务LCN (一)
  • springMvc学习笔记(2)
  • SwizzleMethod 黑魔法
  • win10下安装mysql5.7
  • 程序员最讨厌的9句话,你可有补充?
  • 多线程 start 和 run 方法到底有什么区别?
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 爬虫模拟登陆 SegmentFault
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 删除表内多余的重复数据
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 系统认识JavaScript正则表达式
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 原生js练习题---第五课
  • gunicorn工作原理
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #前后端分离# 头条发布系统
  • (1)常见O(n^2)排序算法解析
  • (8)STL算法之替换
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (六)c52学习之旅-独立按键
  • (三)Honghu Cloud云架构一定时调度平台
  • (四)linux文件内容查看
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化