首页 > 其他分享 >ABC297F 题解

ABC297F 题解

时间:2023-05-06 20:34:23浏览次数:31  
标签:return int 题解 ll ABC297F ans binom mod

容斥萌萌题

给你一个 \(H\times W\) 的棋盘,问在棋盘上随机撒 \(k\) 个点,能够围住这 \(k\) 个点的最小子矩形的期望面积

考虑枚举子矩形可以直接转成计数
问题转变为在 \(n\times m\) 的矩形中撒 \(k\) 个点,有多少种方案使得四条边上均至少有一个点
答案乘上矩形面积再除以所有撒点的方法数就是答案

考虑怎么算这个东西,对四条边分别容斥即可
所有撒点的方案有

\[\binom {nm}{k} \]


分别钦定四条边不撒,那么一共有

\[2\binom{(n-1)m}{k}+2\binom{n(m-1)}{k} \]

种方案
钦定两条边不撒,一共有

\[\binom{(n-2){m}}{k}+\binom{n(m-2)}{k}+4\binom{(n-1)(m-1)}{k} \]

种方案
钦定三条边就是

\[2\binom{(n-2)(m-1)}{k}+2\binom{(n-1)(m-2)}{k} \]

四条边就是

\[\binom{(n-2)(m-2)}{k} \]

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
const ll mod = 998244353;

inline ll f_pow(ll x, int k = mod - 2) {
	ll base = 1;
	for(; k; k >>= 1, x = (x * x) % mod)
		if(k & 1)
			base = (base * x) % mod;
	return base;
}

ll n, m, k;
ll fac[N], ifac[N];

void factory() {
	fac[0] = 1;
	for(int i = 1; i < N; i++)
		fac[i] = fac[i-1] * i % mod;

	ifac[N-1] = f_pow(fac[N-1]);
	for(int i = N - 2; i >= 0; i--) {
		ifac[i] = ifac[i+1] * (i+1) % mod;
	}
}

ll Plus(ll a, ll b) {
	a += b;
	return a > mod ? a - mod : a;
}
ll Minu(ll a, ll b) {
	a -= b;
	return a < 0 ? a + mod : a;
}

ll binom(int a, int b) {
	if(a < b || a < 0 || b < 0)
		return 0;
	return fac[a] * ifac[a - b] % mod * ifac[b] % mod;
}

ll calc(int a, int b) {
	ll ans = binom(a * b, k);

	ll t;
	t = Plus(binom((a-1) * b, k) % mod, binom(a * (b-1), k) % mod);
	t = t * 2 % mod;
	ans = Minu(ans, t);

	ans = Plus(ans, binom((a-2) * b, k));
	ans = Plus(ans, binom(a * (b-2), k));
	ans = Plus(ans, (ll)4 * binom((a-1) * (b-1), k) % mod);

	ans = Minu(ans, (ll)2 * binom((a-2) * (b-1), k) % mod);
	ans = Minu(ans, (ll)2 * binom((a-1) * (b-2), k) % mod);

	ans = Plus(ans, binom((a-2) * (b-2), k));
	return ans;
}

int main() {
	factory();
	cin >> n >> m >> k;
	ll all = binom(n * m, k);

	if(k == 1) {
		printf("%d\n", 1);
		return 0;
	}
	ll ans = 0;
	for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= m; j++) {
			ll t = calc(i, j) * i % mod * j % mod;
			t = t * (n - i + 1) % mod;
			t = t * (m - j + 1) % mod;
			ans = Plus(ans, t);
		}
	}
	printf("%lld\n", ans * f_pow(all) % mod);
	return 0;
}

标签:return,int,题解,ll,ABC297F,ans,binom,mod
From: https://www.cnblogs.com/lostintianyi/p/17378398.html

相关文章

  • Mac M系列芯片 vue前端node-sass兼容问题解决
    0、由于M系列芯片是arm架构,在使用brew安装node时都是arm的node,但是[email protected]版本中不支持arm架构的出现如下报错:Error:NodeSassdoesnotyetsupportyourcurrentenvironment:OSXUnsupportedarchitecture(arm64)withUnsupportedruntime(88)Formoreinfor......
  • LVJR2 赛后题解
    赛后补题请到洛谷比赛。A考虑分类讨论。显然当\(a=0,b=0\)时,答案等于\(0\)。当\(a=0\)或\(b=0\)时,直接将等于\(0\)的数乘以一个很大的数字,将不等于零的数除以一个很大的数字,答案为\(v\)。当\(a,b\)均不为\(0\)时,可以选择先将一个数字减到\(0\),或将一个数字除......
  • [Luogu-P1007]题解(C++)
    PartIPreface原题目(Luogu)PartIISketch给定一个正整数\(L\),表示独木桥长度。给定一个正整数\(N\),表示桥上士兵的数量。给定\(N\)个整数,分别表示每个士兵的坐标。规定走到\(0\)坐标或\(L+1\)的位置为下桥,两个士兵相遇时不能走过去,他们会各自回头走。求出所有士......
  • 【HarmonyOS】【FAQ】HarmonyOS应用开发相关问题解答(一)
     【前提简介】本文档主要总结HarmonyOS开发过程中可能遇到的一些问题解答,主要围绕HarmonyOS展开,包括但不限于不同API版本HarmonyOS开发、UI组件、DevEcoStudio、Gitee示例代码等,并将持续更新哦。 【官方FAQ】【FAQ】HarmonyOS应用及服务开发常见问题汇总(官方总结,持续更新):ht......
  • [AtCoder-AT_ABC108_B]题解(C++)
    PartIPreface原题目(Luogu)原题目(AtCoder)PartIISketchPartIIIAnalysis观察这道题,我们很容易想到,必须推导出\(x1,y1,x2,y2\)与\(x3,y3,x4,y4\)之间的关系。我们观察下图。可以发现:\(\begin{aligned}\begin{cases}x3=x2-(y2-y1)\\y3=y2+(x2-......
  • [CodeForces-143A]题解(C++)
    PartIPreface原题目(Luogu)原题目(CodeForces)PartIISketch设有一个\(2\times2\)的棋盘,上面可以填入\(1-9\)的数字。给出\(6\)个数字,为每行每列以及每个对角线上的数字之和,求相应的摆放方式,无解输出\(-1\)。PartIIIAnalysis观察此题数据规模,不难发现数据......
  • [CodeForces-1104A]题解(C++)
    PartIPreface原题目(Luogu)原题目(CodeForces)PartIISketch给定一个整数\(n\)。将\(n\)拆分成一个数列\(a_1,a_2,a_3,\dots,a_m\)。使得\(\sum\limits_{k=1}^{m}a_k=n\),每个\(a_i\in[0,9]\)且数列中不相同的数的数量尽量少。PartIIIAnalysis我们很容易......
  • 【模板】堆 题解
    题目传送门一道小根堆模板题。在做这道题之前,我们先介绍一下小根堆是什么。我们定义小根堆是一种对于任何一个父结点的权值总是小于或等于子节点权值的完全二叉树。因此,不难看出,一个小根堆的堆顶(这棵树的根节点)应该是这个堆(树)中权值最小的结点。简单介绍完了小根堆,我们再介绍......
  • 【ABC298C】题解
    思路一道很好的复习数据结构的题。对于第\(1\)个问答(既第\(2\)种操作),我用一个小根堆(优先队列,\(\text{priority\_queue}\))来储存第\(i\)个盒子的卡牌。对于第\(2\)个问答(既第\(3\)种操作),我用一个\(\text{set}\)来储存编号为\(i\)个卡牌在哪些盒子里。由于\(\tex......
  • 【学习笔记】【题解】树形依赖 DP 选做
    地址:https://www.cnblogs.com/FReQuenter5156/p/shuxingyilaidp.html/简介这类背包本质上是分组背包问题。将一个节点的每一棵子树看作一组,进行分组背包。所谓分组背包,即在选择物品的时候,一开始将物品分为好几组,在选择时,可以从每一组中至多选择一件物品,问如何获得最大的价值,所......