首页 > 其他分享 >ABC297F AtCoder Beginner Contest 297 F - Minimum Bounding Box 2

ABC297F AtCoder Beginner Contest 297 F - Minimum Bounding Box 2

时间:2023-04-17 19:44:57浏览次数:56  
标签:Box AtCoder Beginner 2ll int res mul MOD mod

https://atcoder.jp/contests/abc297/tasks/abc297_f

在 \(n \times m\) 的棋盘上放置 \(k\) 个棋子,记矩形 A 为能覆盖所有 \(k\) 个棋子的最小的矩形,求 A 的面积的期望

将问题反过来考虑,枚举每种矩形有多少种放置棋子的方案,对于一个 \(n \times m\) 的矩形,我们可以用容斥的方法求出正好覆盖它的方案数

image-20230417192721406

即总方案数减去没有达到任意一条边界的方案数,其中有重复计算的贡献,容斥四层即可消除重复贡献,具体详见代码。

const int N = 1e6 + 10, mod = 998244353;

int mul[N];

int qpow(int a, int x) {
	int res = 1;
	while (x) {
		if (x & 1) res = 1ll * res * a % mod; a = 1ll * a * a % mod; x >>= 1;
	}
	return res;
}

void MOD(i64 &x) {
	x = (x % mod + mod) % mod;
}

int main() {
	int n = read(), m = read(), k = read(), mul[n * m + 1], C[n + 1][m + 1] = {0};
	mul[0] = 1;
	for (int i = 1; i <= n * m; i++) mul[i] = 1ll * mul[i - 1] * i % mod;
	auto _C = [&](int n, int m) -> int {
		if (n < m) return 0;
		return 1ll * mul[n] * qpow(mul[m], mod - 2) % mod * qpow(mul[n - m], mod - 2) % mod;
	};
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			C[i][j] = _C(i * j, k);
		}
	}
	i64 ans = 0;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			if (i * j < k) continue; i64 res = 0;
			MOD(res += C[i][j]);
			if (i > 1) MOD(res -= 2ll * C[i - 1][j] % mod);
			if (j > 1) MOD(res -= 2ll * C[i][j - 1] % mod);
			if (i > 2) MOD(res += C[i - 2][j] % mod);
			if (j > 2) MOD(res += C[i][j - 2] % mod);
			if (i > 1 && j > 1) MOD(res += 4ll * C[i - 1][j - 1]);
			if (i > 2 && j > 1) MOD(res -= 2ll * C[i - 2][j - 1] % mod);
			if (i > 1 && j > 2) MOD(res -= 2ll * C[i - 1][j - 2] % mod);
			if (i > 2 && j > 2) MOD(res += C[i - 2][j - 2]);
			// printf("%d ", res);
			MOD(ans += res * (i * j) % mod * ((n - i + 1) * (m - j + 1)) % mod);
		}
		// puts("");
	}
	printf("%lld", ans * qpow(_C(n * m, k), mod - 2) % mod);
	return 0;
}

标签:Box,AtCoder,Beginner,2ll,int,res,mul,MOD,mod
From: https://www.cnblogs.com/zrzring/p/ABC297F.html

相关文章

  • unigui中TuniComboBox限制只能选择,不能手工输入的方法
    问题:TuniComboBox限制只能选择,不能手工输入确认清楚了,对于UniComboBo没有任何问题,对于UniDBComboBox,该属性就存在一定的问题,初始前,不能设置为csDropDownList,必须为默认的csDropDown,不然初始显示数据信息时,该DB对应的原始数据项目信息不出来,需要在窗口的UniFormAfterShow中再将它......
  • Mapboxgl Chrome75版本下发现问题:中文标签无法加载,由Canvas的measureText()方法导致
    很刁钻的问题,排查了好久。我自己开发测试用的浏览器(版本为112)运行正常,在老版本(75)谷歌浏览器报错如下:mapbox-gl.js:32UncaughtTypeError:Failedtoexecute'getImageData'on'CanvasRenderingContext2D':Valueisnotoftype'long'.atMp.TinySDF.draw(mapbox-gl.j......
  • vue中el-checkbox全选、反选、多选
    <template><div><el-checkboxv-model="checkAll"@change="handleCheckAllChange":indeterminate="isIndeterminate">全选</el-checkbox><el-checkboxv-model="c......
  • pyqt5-QSpinBox
    1、介绍数值调整组件,可以通过点击切换数值。一般是十进制整数2、类和初始化classQSpinBox(QAbstractSpinBox):"""QSpinBox(parent:QWidget=None)"""def__init__(self,parent=None):pass3、属性4、方法5、事件......
  • AtCoder Beginner Contest 295
    ThreeDaysAgo我们定义一个只由数字构成的字符串中的字符能够被重排成相同的两份,我们称这个字符串是个好字符串,比如12341234现在给定一个字符串\(S\),找出所有的\([l,r]\),使得在这段区间中的子段是个好字符串题解:思维+组合计数首先我们根据题意得到:一个好字符串中所有相......
  • Atcoder题解:Agc002_f
    我们可以把这个理解成一种类似卡塔兰数的形式,我们发现,被安排的\(0\)球总数\(i\)和已经出现的颜色种数\(j\)在任意时刻都必须满足\(i\gej\)。然后就可以\(dp\)了,我们每次钦定下一个转移的球是某种颜色。如果下一个转移的球不是\(0\),那么我们就一次性把后面所有这种颜色......
  • Atcoder题解:Agc004_e
    \[吓死我了,还以为写了半天的被自己删掉了\]\[但是\text{Ctrl+S}会保存草稿啊\]\[以后一定要保留这个好习惯\]第一步转化题意,我们把“所有机器人移动”转化成“出口带着边框移动”,而在出口运动过程中超出边框的机器人,就“死”了。然后我们发现,出口运动过程中,假设出口目前走到......
  • mapbox-gl实战教程:地图定位
    在地图开发中,定位是进行的比较多的操作,根据操作,定位到地图上一个位置,定位到地图上的一个区域,或是定位到一条路上等等。下边以实际的代码操作,讲一下mapbox-gl如何进行定位的操作。1、点数据定位:对于点数据的定位,mapbox-gl提供了两个实现方式,一个跳转(jumpTo)到位置,一个飞到(flyTo)指......
  • Atcoder题解:Agc013_e
    我们考虑转化题意,一个合法的将\(1\simN\)划分成长度依次为\(a_1,a_2,\cdotsa_k\)的小区间,对答案的贡献为\(a_1^2a_2^2\cdotsa_k^2\)。化贡献为方案数,我们在每个长度为\(a_i\)的小区间内放置两个独立的标记,每个合法的划分方案对放置标记方案种数的贡献恰好是其对最终答......
  • AtCoder 板刷 / vp 记录
    ARC104AtCoder传送门A题解一道小学数学题,$X=\frac{A+B}{2},Y=\frac{A-B}{2}$。B题解一道暴力题。发现子串合法的充要条件是$cnt_{\text{A}}=cnt_{\text{T}}\landcnt_{\text{G}}=cnt_{\text{C}}$,暴力统计即可。C题解简单区间dp。发现$[1,2n]$可以拆......