[补题记录] Atcoder Beginner Contest 297(F)

URL:https://atcoder.jp/contests/abc297

目录

F

Problem/题意

Thought/思路

Code/代码


F

Problem/题意

给一个 H * W 的矩形,在其中任意放置 K 个点,由这 K 个点构成的最小矩形带来的贡献为该矩形的面积,这 K 个点构成一种方案。

问面积的期望(总面积 / 总方案数)。

Thought/思路

很容易发现,对于这个 H * W 的矩形而言,总方案数为:C_{H*W}^{K}。也就是说,我们只需要求出总面积即可。

对于某个最小矩形,构成它的摆放方法有很多种,也就是说,如果我们能算出一个大小为 i * j 的矩形,他有 X 种合法的摆放方案,再用合法方案数乘上该矩形的面积(即 X * i * j),就是对应的贡献。

问题就在于如何求出一个大小为 i * j 的矩形有多少种合法摆法:应用容斥原理。


简单说一下容斥原理:合法方案 = 总方案 - 非法方案。对于几个集合,求他们的并集,就应用到容斥原理:加上奇数个集合的交集,减去偶数个集合的交集。

https://blog.csdn.net/Annabel_CM/article/details/110285940


对于一个 i * j 的矩形,很容易求出总方案数,那么问题就在于求出非法方案数。

先看非法情况下的矩形有:C1、C2、C3、C4

所以现在的目的就明确了,求出 C1、C2、C3、C4 的并集,得到非法方案数,再用 i * j 的总方案数减去非法方案数,就能算出合法方案数。

那么怎么求它们的并集呢?


 上面的写法中,C0 代表总方案数,[ ] 里的内容就是非法方案数。我们对每一类交集举例说明:

(1)C1:C_{(i-1)*j}^{K} 或 C_{i* (j - 1)}^{K}

(2)C1 & C2:C_{(i-2)*j}^{K}

(3)C1 & C3:C_{(i-1)*(j-1)}^{K}

(4)C1 & C2 & C3:C_{(i - 2)*(j - 1)}^{K}

(5)C2 & C3 & C4:C_{(i - 1) * (j - 2)}^{K}

(6)C1 & C2 & C3 & C4:C_{(i-2)*(j-2)}^{K}

把上面手写的图片中的内容,用这 6 种情况依次替换,合并同类项,就能得到下列式子:

(cnt:就是组合数 C)


接下来还剩最后一个部分,对于我们上面求出来的一种矩形的的有效摆放方法,在 H * W 中又能摆在多少个位置呢?

只需要把 i、j 距离 H、W 的距离 + 1,然后相乘,就是 i * j 这个矩形能摆放的位置数:

(H - i + 1) * (W - j + 1)


位置数 * 矩形面积(i * j)* 合法方案数,就是一个矩形 i * j 带来的贡献,遍历 H、W,求出每一种(i,j)的贡献,累加,就是最后的总贡献。

Code/代码

#include "bits/stdc++.h"#define int long longconst int mod = 998244353;int h, w, k, fact[1000007], invf[1000007];int ksm(int a, int b) {int res = 1;while (b > 0) {if (b & 1) res = res * a % mod;a = a * a % mod;b /= 2;}return res;
}int C(int x, int y) {if (x < y) return 0;return fact[x] * invf[y] % mod * invf[x - y] % mod;
}signed main() {std::cin >> h >> w >> k;if (k == 1) {std::cout << 1;return 0;}fact[0] = 1;invf[0] = ksm(fact[0], mod - 2);for (int i = 1; i <= 1000005; ++ i) {fact[i] = fact[i - 1] * i % mod;invf[i] = ksm(fact[i], mod - 2) % mod;}int ans = 0;for (int i = 1; i <= h; ++ i) {for (int j = 1; j <= w; ++ j) {int cnt = 0;for (int x = 0; x <= 2; ++ x) {for (int y = 0; y <= 2; ++ y) {cnt = (cnt + C((i - x) * (j - y), k) * (x == 1 ? -2 : 1) * (y == 1 ? -2 : 1) % mod + mod) % mod;}}ans = (ans + i * j % mod * (h - i + 1) % mod * (w - j + 1) % mod * cnt % mod + mod) % mod;}}std::cout << ans * ksm(C(h * w, k), mod - 2) % mod;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/97612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.6 IntelliJ IDEA开发工具

前言&#xff1a; ### 1.6 IntelliJ IDEA开发工具笔记 - **背景**&#xff1a; - 使用基础文本编辑器如记事本编写Java代码虽然可行&#xff0c;但存在效率低下且难以调试的问题。 - 集成开发环境 (IDE) 可以有效地提高Java程序的开发效率。 - **常见Java IDE**&#xf…

光伏发电预测(GRU模型,Python代码)

运行效果&#xff1a;光伏发电预测&#xff08;GRU模型&#xff0c;Python代码&#xff09;_哔哩哔哩_bilibili 所有库的版本&#xff1a; 1.数据集&#xff08;连续10年不间断采集三个光伏电站的发电量及天气情况&#xff0c;每隔半个小时采集一次信息&#xff0c;因此&…

NICE-SLAM——论文简析

NICE-SLAM: Neural Implicit Scalable Encoding 现有的神经隐式表征方法会产生过度平滑的场景重建&#xff0c;并且难以扩展到大型场景。这些局限性主要是由于其简单的全连接网络架构没有将局部信息纳入观测。NICE-SLAM通过引入分层场景表示法&#xff0c;纳入了多层次的局部信…

【Kotlin精简】第2章 集合

1 简介 在 Kotlin 中集合主要分为可变集合与只读集合&#xff0c;其中可变集合使用 “Mutable” 前缀 集合类名表示&#xff0c;比如 MutableList、MutableSet、MutableMap 等。而对于只读集合就是和 Java 中集合类名是一致。 Java 中的 List 非 Kotlin 中的 List , 因为 Kot…

GPT系列论文解读:GPT-3

GPT系列 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一系列基于Transformer架构的预训练语言模型&#xff0c;由OpenAI开发。以下是GPT系列的主要模型&#xff1a; GPT&#xff1a;GPT-1是于2018年发布的第一个版本&#xff0c;它使用了12个Transformer…

ChatGPT Vision初体验

本周&#xff0c;OpenAI为其广受欢迎的 ChatGPT 平台发布了一项突破性的补充。除了处理文本之外&#xff0c;ChatGPT 现在还可以处理图像并聊天。 很难夸大这件事的重要性。目前多达70% 的内容是视觉内容而不是书面内容。人们每年会生成数千张照片&#xff0c;而当今许多最大的…

VR模拟鸡胚培养接种实验,打造沉浸式的学习环境

在医学教育领域&#xff0c;传统的鸡胚接种实验一直是教学的重要组成部分。然而&#xff0c;这种实验方法存在一定的局限性&#xff0c;如操作难度大、成本高、安全隐患等。为了解决这些问题&#xff0c;越来越多的教育机构开始尝试引入虚拟现实(VR)技术&#xff0c;以模拟鸡胚…

研发质量管理体系

研发质量管理体系的脉络是怎样的&#xff1f;如何建立适合组织发展的研发质量管理体系&#xff1f;质量管理的核心是什么&#xff1f;一些思考&#xff0c;一些线索&#xff0c;欢迎朋友们一起探讨、碰撞。

vscode 乱码解决

windows 10 系统 vs code 编译运行和调试 C/C_vscode windows编译_雪的期许的博客-CSDN博客 VS Code默认文件编码时UTF-8&#xff0c;这对大多数情况是没有问题的&#xff0c;却偏偏对C/C有问题。如果以UTF-8编码保存C/C代码&#xff0c;那么只能输出英文&#xff0c;另外使用…

我在 NPM 发布了新包: con-colors

链接地址&#xff1a;npmjs.com con-colors 安装依赖 yarn add con-colors使用 导入&#xff1a; import { print } from "con-colors";使用&#xff1a; print.succ("成功的消息"); print.err("失败的消息")例子&#xff1a; import { p…

红包雨高并发压测记录(200台机器压测实录)

压测5000线程10秒内循环5次&#xff0c;5台2核心4线程的机器&#xff0c;QPS2500 压测10000线程10秒内循环5次&#xff0c;10台2核心4线程的机器&#xff0c;QPS5000 压测200000线程10秒内循环5次&#xff0c;200台2核心4线程的机器&#xff0c;QPS100000 虽然接口异常率都为零…

【云计算网络安全】DDoS 缓解解析:DDoS 攻击缓解策略、选择最佳提供商和关键考虑因素

文章目录 一、前言二、什么是 DDoS 缓解三、DDoS 缓解阶段四、如何选择 DDoS 缓解提供商4.1 网络容量4.2 处理能力4.3 可扩展性4.4 灵活性4.5 可靠性4.6 其他考虑因素4.6.1 定价4.6.2 所专注的方向 文末送书《数据要素安全流通》本书编撰背景本书亮点本书主要内容 一、前言 云…

AI工程化—— 如何让AI在企业多快好省的落地?

作为计算机科学的一个重要领域&#xff0c;机器学习也是目前人工智能领域非常活跃的分支之一。机器学习通过分析海量数据、总结规律&#xff0c;帮助人们解决众多实际问题。随着机器学习技术的发展&#xff0c;越来越多的企业将机器学习技术作为核心竞争力&#xff0c;并运用在…

如何用万界星空科技低代码平台快速开发一个MES系统?

一、制造业工厂生产现状&#xff1a; 1、生产计划复杂 生产效率低&#xff0c;工作量大&#xff0c;周期长&#xff1b;生产计划执行准确性不高&#xff0c; 生产工单准时完工率过低&#xff1b;计划人员很难得到实际生产进度的准确信息&#xff1b;人员沟通成本高&#xff1…

端口没有占用,Springboot却提示端口占用了

1.问题描述 *************************** APPLICATION FAILED TO START ***************************Description:Web server failed to start. Port 19004 was already in use.Action:Identify and stop the process thats listening on port 19004 or configure this applica…

Python 无废话-办公自动化Excel修改数据

如何修改Excel 符合条件的数据&#xff1f;用Python 几行代码搞定。 需求&#xff1a;将销售明细表的产品名称为PG手机、HW手机、HW电脑的零售价格分别修改为4500、5500、7500&#xff0c;并保存Excel文件。如下图 Python 修改Excel 数据&#xff0c;常见步骤&#xff1a; 1&…

机器学习必修课 - 编码分类变量 encoding categorical variables

1. 数据预处理和数据集分割 import pandas as pd from sklearn.model_selection import train_test_split导入所需的Python库 !git clone https://github.com/JeffereyWu/Housing-prices-data.git下载数据集 # Read the data X pd.read_csv(/content/Housing-prices-data/t…

【SQL】MySQL中的约束

1. 主键约束&#xff08;primary key&#xff09;&#xff1a; 相当于唯一约束非空约束分为单列主键&#xff0c;多列联合主键&#xff0c;一个表只有一个主键多列联合主键的每列都不能为空 2. 自增长约束&#xff08;auto_increment&#xff09;&#xff1a; 用在单列主键后…

Vim教程

目录 vim 介绍 常用的四种模式 首先先学会如何正确进入和退出vim&#xff1a; normal模式 insert模式&#xff1a; command模式&#xff1a; v-block模式&#xff1a; vim异常退出 vim配置 vim 介绍 Vim是一款高度可定制的文本编辑器&#xff0c;它的前身是Vi&#xf…

vue-devtools插件安装

拓展程序连接 链接&#xff1a;https://pan.baidu.com/s/1tEyZJUCEK_PHPGhU_cu_MQ?pwdr2cj 提取码&#xff1a;r2cj 一、打开谷歌浏览器&#xff0c;点击扩展程序-管理扩展程序 二、打开开发者模式&#xff0c;将vue-devtools.crx 拖入页面&#xff0c;点击添加扩展程序 成…