「学习笔记」容斥原理

这篇具有很好参考价值的文章主要介绍了「学习笔记」容斥原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引入

\(A_1\):学语文的人, \(A_2\):学数学的人,\(A_3\):学英语的人,\(A_4\):学 OI 的人

\(A_1 \cap A_2\):同时学语数的人

\(A_1 \cup A_2\):学语文或数学的人

\(\left | A_1 \cup A_2 \right | = \left | A_1 \right | + \left | A_2 \right | - \left | A_1 \cap A_2 \right |\)

\(\left | A_1 \cup A_2 \cup A_3 \right | = \left | A_1 \right | + \left | A_2 \right | + \left | A_3 \right | - \left | A_1 \cap A_2 \right | - \left | A_1 \cap A_3 \right | - \left | A_2 \cap A_3 \right | + \left | A_1 \cap A_2 \cap A_3 \right |\)

\(\left | A_1 \cup A_2 \cup A_3 \cup A_4 \right | = \left | A_1 \right | + \left | A_2 \right | + \left | A_3 \right | + \left | A_4 \right |\\ - \left | A_1 \cap A_2 \right | - \left | A_1 \cap A_3 \right | - \left | A_2 \cap A_3 \right | - \left | A_1 \cap A_4 \right | - \left | A_2 \cap A_4 \right | - \left | A_3 \cap A_4 \right | \\+ \left | A_1 \cap A_2 \cap A_3 \right | + \left | A_1 \cap A_2 \cap A_4 \right | + \left | A_2 \cap A_3 \cap A_4 \right | \\- \left | A_1 \cap A_2 \cap A_3 \cap A_4 \right |\)


我总结了一句话

容斥原理,就是总共的减去重复的加上缺失的。

容斥原理的一般式

\[\sum_{b \subseteq \left \lbrace A_1, A_2, \cdots, A_n \right \rbrace } (-1) ^ {\left| B \right | + 1} \cdot \left | \bigcap_{a_i \in B}A_i \right | \]

问题

\(n\) 对夫妻坐成一圈,每对夫妻不能坐在一起,问方案数。

总的方案数为 \(\dfrac{2n!}{2n} = (2n - 1)!\)
我们将夫妻绑定在一起,这样,这对夫妻可以看作是一个人。
来计算不合法方案数:
一对夫妻坐在一起时,方案数为 \((2n - 2)!\),在 \(n\) 对夫妻中选一堆绑定,并且夫妻之间也有坐的顺序,因此一对夫妻坐在一起的非法方案数为 \(2 \cdot C(n, 1) \cdot (2n - 2)!\)
但是,在这一对夫妻坐在一起的方案数中,包含了两对夫妻坐在一起、三对夫妻坐在一起的情况,因此,有重复计算的,两对夫妻坐在一起被计算了两次,三对夫妻坐在一起被计算了三次。
我们要减去两对夫妻坐在一起的情况的方案数,即 \(2^2 \cdot C(n, 2) \cdot (2n - 3)!\),在这两对夫妻坐在一起的情况里,同样,也包含了三对夫妻坐在一起的情况,而这一减,三对夫妻坐在一起的方案数直接变为 \(0\) 了,因此我们需要再把他们加上。
由此,就能够看出有容斥的规律了,我们往后推,减去四对夫妻坐在一起的方案数,加上 \(5\) 对夫妻坐在一起的方案数。。。
因此,总的非法方案数就是 \(2 \cdot C(n, 1) \cdot (2n - 2)! - C(n, 2) \cdot (2n - 3)! \cdot 2^2 + C(n, 3) \cdot (2n - 4)! \cdot 2^3 \cdots\)
总的方案数减去非法方案数就是 \((2n - 1)! - 2 \cdot C(n, 1) \cdot (2n - 2)! + C(n, 2) \cdot (2n - 3)! \cdot 2^2 - C(n, 3) \cdot (2n - 4)! \cdot 2^3 \cdots\\\)

\[\sum_{i = 0}^n C(n, i) \cdot (2n - i - 1)! \cdot 2^i \cdot (-1) ^ i \]

询问 \(1 - n\) 中有多少个数可以表示为 \(x^y\)\(y > 1\) 的形式。\(\left (n \le 10^{18} \right )\)

由于 long long 的范围可知,可行的 \(y\) 小于等于 \(64\)
在这 \(n\) 个数中,能表示成 \(x^2\) 的数有 \(\sqrt{n}\) 个,能表示成 \(x^3\) 的数有 \(\sqrt[3]{n}\) 个,能表示成 \(x^y\) 的数有 \(\sqrt[y]{n}\) 个。
但是,我们的答案就是 \(\sum_{i = 2}^{y}\sqrt[i]{n}\) 吗?
很明显,不是。
看一看这种情况,\(y^6 = (y^3)^2 = (y^2)^3\),很明显,直接求和会有重复,因此,我们要减去重复的部分

cin >> n;
for (int a = 2; a <= 64; ++ a) {
    num[a] = 0;
// num[a] 代表 x^a 这种形式的数被算了几次
}
for (int a = 2; a <= 64; ++ a) { // 算 x^a 这种形式的数有多少个
    ll v = floor(pow(n, (long double)1.0 / a)) - 1;
//  ll v = (ll)floor(exp(log(n) / a)) - 1;
    int d = 1 - num[a];
    ans += v * d;
    for (int b = a; b <= 64; b += a) {
        num[b] += d;
    }
}

代码解释

num[a] 代表 \(x^a\) 这种形式的数被算了几次,很明显,我们希望最后每个 num 都为 \(1\),因此,我们需要加上少的或者减去多的。

int d = 1 - num[a];
ans += v * d;`

最后,我们再更新 num

for (int b = a; b <= 64; b += a) {
	num[b] += d;
}

这段代码可以这么理解
假设我们计算 \(x^2\),我们会算到 \(2^2、4^2、8^2 \cdots\),我们可以将它们转化一下,即 \(2^2、2^4、2^6 \cdots\),因此,只要是指数是二的倍数的形式的数,我们都能算到。

真题

[春季测试 2023] 幂次
这道题对于 pow 有精度要求,要用 long double,或者用 exp,否则最后一个点过不去。文章来源地址https://www.toymoban.com/news/detail-469923.html

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

ll n, k, ans;
ll num[70];

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0),	cout.tie(0);
	cin >> n >> k;
	for (int a = k; a <= 64; ++ a) {
		num[a] = 0;
	}
	for (int a = k; a <= 64; ++ a) {
		ll v = floor(pow(n, (long double)1.0 / a)) - 1;
//		ll v = (ll)floor(exp(log(n) / a)) - 1;
		ll d = 1 - num[a];
		ans += v * d;
		for (int b = a; b <= 64; b += a) {
			num[b] += d;
		}
	}
	cout << ans + 1 << '\n';
	return 0;
}

到了这里,关于「学习笔记」容斥原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LeetCode 2409. Count Days Spent Together【前缀和,容斥原理】简单

    本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,

    2023年04月17日
    浏览(28)
  • LeetCode 周赛 342(2023/04/23)容斥原理、计数排序、滑动窗口、子数组 GCB

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问。 大家好,我是小彭。 前天刚举办 2023 年力扣杯个人 SOLO 赛,昨天周赛就出了一场 Easy - Easy - Medium - Medium 的水场,不得不说 LeetCode 是懂礼数的 😁。 接下来,请你跟着小彭的思路,一步步将问题做难,

    2023年04月24日
    浏览(30)
  • 将强化学习引入NLP:原理、技术和代码实现

    本文深入探讨了强化学习在自然语言处理(NLP)中的应用,涵盖了强化学习的基础概念、与NLP的结合方式、技术细节以及实际的应用案例。通过详细的解释和Python、PyTorch的实现代码,读者将了解如何利用强化学习优化NLP任务,如对话系统和机器翻译。 关注TechLead,分享AI全维

    2024年02月05日
    浏览(28)
  • VUE3 学习笔记(八)引入 EasyUI for Vue

      目录 一、什么是 EasyUI? 二、安装EasyUI for Vue3 1. 使用NPM安装 2. 导入EasyUI 三、安装完成出现问题解决 easyui是一个基于jQuery、Angular、Vue和React的用户界面组件的集合。 easyui为构建现代的、交互式的、javascript应用程序提供了基本功能。 使用easyui,你不需要写很多javascript代码,

    2023年04月21日
    浏览(24)
  • C# Blazor 学习笔记(5):blazor文件夹组件引入

    为了更好的组件化管理整个文件,我选择使用分文件夹对项目组件进行分类。 Shared:Layout布局空间放置地方,由于默认创建,动也不好动,我就不动这个名称了,原本想改成Layout的 Pages:业务页面 Components:自定义组件文件 我创建了B_Col和B_Row两个组件。因为我怕我的命名和

    2024年02月14日
    浏览(34)
  • 【笔记】ChatGPT是怎样炼成的(李宏毅2023机器学习课程引入部分)

    来源:【授权】李宏毅2023春机器学习课程 ChatGPT太火热了,借此简单了解一下 ChatGPT的newbie之处在哪里? 同一个问题,它的每次回答都不同;处于同一个chat中,我可以追问多个问题,因为它知道上下文。 误解1: ChatGPT的回应是罐头回应。(ie. 比如我让ChatGPT给我讲个笑话,罐

    2023年04月17日
    浏览(34)
  • C++学习笔记——C++ 新标准(C++11、C++14、C++17)引入的重要特性

    目录 1、简介 2.自动类型推导和初始化 示例代码 3.智能指针 示例代码 4.Lambda 表达式 示例代码 5.右值引用和移动语义 示例代码 6.并发编程支持 示例代码 7.其他特性 八、案例:实现一个简单的并发下载器 上一篇文章:     C++标准模板库(STL)是C++的一个重要组成部分,它提

    2024年01月19日
    浏览(28)
  • 【Linux技术专题】「夯实基本功系列」带你一同学习和实践操作Linux服务器必学的Shell指令(排查问题指令 - 上)

    在线上排查问题时,查询日志、查看系统配置和分析操作系统信息是至关重要的。这些操作可以帮助我们深入了解软件和服务的兼容性,并解决潜在的问题。在本次学习中,我们将介绍并深入学习一些我在处理类似问题时常用的指令。通过掌握这些指令,你将能够更加高效地

    2024年01月16日
    浏览(42)
  • MPC学习笔记(1)——原理

    最近在学习M. W. Mehrez的MPC时发现了很多不了解的细节,分享一下对该算法的梳理与理解。 在自动驾驶或机器人领域中,模型预测控制(Model Predictive Control, MPC)解决的是轨迹规划的问题。其前提条件是环境地图、载体位姿已知,根据MPC算法,得到一条轨迹,轨迹中包含载体运行

    2024年02月14日
    浏览(30)
  • 1. 相机标定原理(学习笔记)

    在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这个求解参数的过程就称之为相机标定。 其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性 。[百度百科

    2024年02月08日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包