容斥原理+模板题HDU-1796

C++基础数论—————容斥原理 前言: 温馨提示,此篇博客将涉及排列组合(链接)。 概念: 在计数时,必须注意没有重复,没有遗漏。为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为容斥原理。 好了,我们理解... 阅读详情

容斥原理描述如下:

说大白话就是求几个集合的并集,要计算几个集合并集的大小,我们要先将所有单个集合的大小计算出来,然后减去所

有两个集合相交的部分,再加上所有三个集合相交的部分,再减去所有四个集合相交的部分...依此类推,一直计算到

所有集合相交的部分。


最简单的就是两个集合的并集:


所以数学公式就可以表示为 |A∪B|=|A|+|B|-|A∩B|。

对于三个集合,数学公式为|A∪B∪C|=|A|+|B|+|C|-|A∩B|-|A∩C|-|B∩C|+|A∩B∩C|。


常用方法有两种:递归法和二进制枚举法。

递归法是利用dfs的思想进行搜索,检索每一种方案进行容斥。

二进制枚举的方法最大的好处是能够枚举出所有元素组合的不同集合。假设一个集合的元素有m个,则对于m长的二进

制数来说就有m个1或0的位置,对于每一个1就对应一个元素。

整个二进制枚举完就是所有子集,从0到2^m就行。[0, 2^m)


看下模板题HDU-1796

题意:给定一个数n,数列m个数,求这小于n的数中,有多少个数满足能被这m个数中任意一个数整除。

思路:1~n之间有多少个能被x整除的数,公式为n/x,题目中要求小于n,所以(n-1)/x。

可以递归法求,需要保存中间态重叠x次的最小公倍数lcm,符合题意的数有(n-1)/lcm个,根据k表示重叠的次数进

行或者加上,或者减去。

也可以用二进制枚举法,将符合条件的m个数,看作m位,每位是0或者是1,那么一共有2^m种状态,只要判断一下每

一个状态有多少个1,也就是有多少个数(重叠多少次),记为k,每一个1代表哪几个具体的数,求这几个数的最小

公倍数,然后(n-1)/lcm,  利用k的值来判断应该减去还是加上即可。


Code1:

#include <bits/stdc++.h>
using namespace std;
int n, m, num[15], ans, tot, x;
int gcd(int a, int b)
{
	if(a%b == 0) return b;
	return gcd(b, a%b);
}
void dfs(int pos, int pre_lcm, int k)
{
	for(int i = pos+1; i < tot; ++i)
	{
		int lcm = pre_lcm/gcd(num[i], pre_lcm)*num[i];
		if(k&1) ans += (n-1)/lcm;
		else ans -= (n-1)/lcm;
		dfs(i, lcm, k+1);
	}
}
int main()
{
	while(~scanf("%d %d", &n, &m))
	{
		ans = 0; tot = 1;
		for(int i = 1; i <= m; ++i)
		{
			scanf("%d", &x);
			if(x > 0 && x < n) num[tot++] = x;
		}
		dfs(0, 1, 1);
		printf("%d\n", ans);
	}
	return 0;
}

Code2:

#include <bits/stdc++.h>
using namespace std;
int n, m, x, k, tot, up, t, pos, lcm, ans, num[15];
int gcd(int a, int b)
{
	if(a%b == 0) return b;
	return gcd(b, a%b);
}
int main()
{
	while(~scanf("%d %d", &n, &m))
	{
		tot = 1; ans = 0;
		for(int i = 1; i <= m; ++i)
		{
			scanf("%d", &x);
			if(x > 0 && x < n) num[tot++] = x;
		}
 		up = (1<<(tot-1));
		for(int i = 1; i < up; ++i)
		{
			t = i, k = 0, pos = 1; lcm = 1;
			while(t)
			{
				if(t&1)
				{
					lcm = num[pos]/gcd(lcm, num[pos])*lcm;
					++k;
				}
				t >>= 1; ++pos;
			}
			if(k&1) ans += (n-1)/lcm;
			else ans -= (n-1)/lcm;
		}
		printf("%d\n", ans);
	}
	return 0;
}


图片来自百度图片,参考博文:

http://blog.youkuaiyun.com/sr_19930829/article/details/44938217

http://blog.youkuaiyun.com/xianglunxi/article/details/9310105

【一步到位】Android Studio 实现安卓连接阿里云物联网云平台 最新版本目前是Android Studio Iguana | 2024.1.2,你可以到官网上去找之前的版本,手上有工作项目的不要去轻易尝试,说不定你就编译失败了,失败了也不要担心,解决就可以了。 阅读详情

相关推荐

CentOS7.9 安装 ImageMagick,图片转换为HEIC图像格式

由于ImageMagick7以下不支持heic等图片格式,所以重新安装了ImageMagick7.1版本支持heic格式,在网上找了很多资料,归纳总结并写此文章记录一下。在Linux(CentOS7.9)上安装ImageMagick7.1.1-38。

shmily_i的博客 1941

HDU - 1796 容斥原理

昨天鸽了 题目连接 大意是给一个n和一个共有m个数的集合,让求出[1,n)中有多少个数能整除集合中的某一个或多个数 因为m大小为10,所以很容易想到是容斥原理 在[1,n)中能整除数A的数的个数为(n-1)/A可以O(1)算出来,而这个A是可以枚举的(A肯定是集合中某个子集的的最小公倍数,用容斥枚举出来这些子集,子集大小为奇就加,偶数就减)举个例子集合为{2,3,5}那么答案=2的倍数的个...

Rwqgmz的博客 278

手把手教你用FreeModbus RTU协议栈实现STM32与PLC通信(附Keil工程)

本文详细介绍了如何使用FreeModbus RTU协议栈在STM32上实现与PLC的工业通信。从环境搭建、工程配置到关键移植接口实现,提供了Keil工程模板和调试技巧,帮助开发者快速掌握Modbus RTU通信技术,适用于工业自动化领域的设备间通信需求。

weixin_42549037的博客 419

hdu1796(容斥原理)

题目链接:hdu1796 容斥原理介绍 题目大意:给出m个数,在1~n(不包括n)之间找出所有能对m个数整除的 思路:枚举出所有可能组合,求出每一种组合的最小公倍数,运用容斥原理累加所有情况 #include #include #include #include #include using namespace std; #define LL __int64 int a[15

no pains,no gains 1286

PCB布局布线要求及多层电路板叠加原则

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考本文主要针对PCB布局布线中的要点进行了总结,并对多层电路板的叠加原则进行了解释。

Ka_wyb的博客 2939

Materials - UE5中的PivotPainter

可以使用3DS Max Script中的脚本(Pivot Painter)对模型进行处理,让每个Element都有自己的Pivot Point,来方便控制和制作一些特殊的顶点动画效果;

GT的虚幻引擎文档 1289

HDU 1796 (容斥)

直接二级制枚举子集,按照容斥加减加减就行了。 #include #include #include #include using namespace std; typedef long long LL; LL N , M; const int maxn = 20; LL s[maxn]; LL gcd(LL a , LL b) { if(b>a) swap(a,b);

愿岁月如歌 277

避坑指南:将大华官方Java SDK无缝迁移到SpringBoot 2.x项目的完整流程

本文详细介绍了如何将大华官方Java SDK无缝迁移到SpringBoot 2.x项目,重点解决内存管理、连接池设计和异步处理等核心问题。通过设备连接池化、异步非阻塞接口改造和内存管理优化,实现刷卡、刷脸等认证功能的高效整合,提升Web服务的稳定性和性能。

weixin_42557830的博客 418

容斥定理(1)HDU 1796--How many integers can you find

【题目】HDU1796 【题意】:

紫苏 609

[AI8051U入门第一步]环境安装和按键控制流水灯

本文介绍了AI8051U单片机的开发环境搭建及GPIO应用。主要内容包括:1)通过ISP软件完成Keil开发环境配置;2)AI8051U特性介绍,包括32位8051内核、浮点运算单元及丰富外设;3)GPIO输入输出模式解析,并附流水灯控制代码;4)提供完整的系统初始化、延时函数及LED控制代码实现。文章配套资源包含完整工程代码,适用于智能硬件及物联网开发。

sinat_58149788的博客 671

Cartographer实现双雷达建图

TRAJECTORY_BUILDER_2D.num_accumulated_range_data = 2 --执行一次前端匹配需要的激光扫描分段数量。关于num_subdivisions_per_laser_scan。num_laser_scans =2,--订阅激光扫描话题数量。Frame改为 前雷达laser_1 后雷达laser_2。雷达的话题由scan改为,前scan_1 后scan_2。有些人说需要改成2,但我这里改成2反而不行,1才可以。

Studying…… 1261

HDU - 1796(容斥原理+特殊情况0)

hdu1796 题解:在dfs之前不要刻意删去一些数(这些数是其它数的倍数),注意0,在输入的时候就删去它. #include<bits/stdc++.h> using namespace std; typedef long long LL; const int maxn=2e5+10; LL n; int m; LL a[25],b[25]; int cnt; LL ans=0; void dfs(int pos,LL flag,LL t,int f) { if(t>n)retu

qq_41856950的博客 220

OpenClaw第2章:快速安装

本章将手把手教你安装 OpenClaw。

Maynor的博客 3236

hdu 1796(容斥原理)

传送门 虽然hdu本站和hdu_split都挂了,但是vjudge还能用。 本题差不多是容斥原理的模板题,答案就是:是一个数的倍数的个数 - 是两个数的倍数的个数 + 是三个数的倍数的个数...... DFS直接上,可做容斥的模板。 #include #include #include #include using namespace std; typedef long long ll;

KGV093的博客 357

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

「学习笔记」容斥原理及其应用

错排问题 HDU 1465 #include &amp;amp;amp;amp;amp;lt;cstdio&amp;amp;amp;amp;amp;gt; long long dp[21]; int main() { dp[0] = dp[1] = 0; for(int i = 2; i &amp;amp;amp;amp;amp;lt;= 20; i ++) dp[i] = i * 1ll * dp[i - 1] + ((i &amp;amp;a

_Gion 746

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【容斥原理】HDU-1796-How many integers can you find

题意:问1-n范围内(小于n)的数有多少个能够整除一个集合{a,b,……}里任意一个数。 思路:容斥原理的模板题,直接上模板了。 题目 #include #include #include #include #include #include #include #include #include using namespace std; #define LL long long int

AndRing的专栏 960

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

How many integers can you find HDU - 1796 (容斥原理)

  Now you get a number N, and a M-integers set, you should find out how many integers which are small than N, that they can divided exactly by any integers in the set. For example, N=12, and M-integer...

日月 362

【HDU4135】Co-prime(容斥原理)

题目链接   Co-prime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 8179    Accepted Submission(s): 3255   Problem Description ...

よろしくお願いします 234

hdu1796(容斥原理基本运用)

传送门 题意:求n以内能够被所给的集合中的数整除的数的个数。 思路:很容易想到容斥原理,先找出1...n内能被集合中任意一个元素整除的个数,再减去能被集合中任意两个整除的个数,即能被它们两只的最小公倍数整除的个数,因为这部分被计算了两次,然后又加上三个时候的个数,然后又减去四个时候的倍数...所以深搜,最后判断下集合元素的个数为奇还是偶,奇加偶减。 为什么是最小公倍数 比如(6,9)其实18的...

henucm的博客 537

Hdu--1796(数论,容斥原理)

2014-09-0501:01:28 How many integers can you find Time Limit: 12000/5000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4202Accepted Submission(s): 1196 ...

dingdi3021的博客 206

容斥原理——经典例题(组合数学)

一.容斥原理 就是人们为了不重复计算重叠部分,想出的一种不重复计算的方法。 先来认识一下这两个符号:与(如图) 蓝色的圈就是c1c2,红色的圈围起来的就是c1c2 二.例题:组合数学 1.题目 1.1.题目描述 八是个很有趣的数字啊。八=发,八八=爸爸,88=拜拜。当然最有趣的还是8用二进制表示是1000。怎么样,有趣吧。当然题目和这些都没有关系。 某个人很无聊,他想找出[a,b...

weixin_43908980的博客 2万+

数论之容斥原理 与经典例题

容斥原理 容斥原理是对多个集合的一种计数方法。人们为了不重复、不遗漏地计数,想到了一个特别的计数方法,称为容斥原理。 简单来说,某个事物有很多类,我们现在要计算A、B、C三类的和,那么总和=A类元素个数+B类元素个数+C类元素个数-既是A又是B类元素个数-既是B又是C类元素个数-既是A又是C类元素个数+既是A又是B又是C类元素个数。 这样计算非常方便且不重不漏,我们用一个集合图直观的就能看出这个原理: 普遍推广:要计算几个并集的大小,我们要先将所有单个集合的大小计算出来,然后减去所有两个集合相交的大小,然

harry12138小白的博客 5718

【4.数学知识-模板】9.容斥原理(模板)

容斥原理一.能被整除的数 一.能被整除的数 题目来源:能被整除的数 #include<iostream> using namespace std; typedef long long LL; const int N = 20; int p[N], n, m; int main() { cin >> n >> m; for(int i = 0; i < m; i++) cin >> p[i]; int res = 0;

qq_52384627的博客 341

容斥原理(模板+例题)

网上找来方便自己看,理解。 容斥原理:在计数时,必须注意无一重复,无一遗漏。为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为容斥原理。 也可表示为 设S为有限集,

时光、疏离了记忆づ童话的博客 6739

容斥定理(转载)

这篇文章发表于http://e-maxx.ru/algo/inclusion_exclusion_principle,原文是俄语的。由于文章确实很实用,而且鉴于国内俄文资料翻译的匮乏,我下决心将其翻译之。由于俄语对我来说如同乱码,而用Google直接翻译中文的话又变得面目全非,所以只能先用Google翻译成英语,再反复读,慢慢理解英语的意思,实在是弄得我头昏脑胀。因此在理解文章意思然后翻译成中文的...

weixin_33937499的博客 1935

容斥原理简单的入门题总结

容斥原理 这里对容斥原理进行简单的总结,容斥原理主要用于求n个数能组成的乘积种类数,从这之中我们就可以引申出容斥原理的很多用法,对于给定数字求组合种类的题目,我们就要想到用lcm去运算,对于给定数求互质/不互质时,我们就要想到对给定的数进行质因数分解。下面给出一些容斥原理的入门题。 容斥原理第一题 HDU-2204- Eddy’s爱好 题意就是给出一个数n,问1-n中有多少个数可以表...

lajiyuan的博客 4439
上一篇: 网络流-割的概念以及定理
下一篇: 2017年第0届浙江工业大学之江学院程序设计竞赛决赛—A qwb与支教
薄层
博客等级 码龄10年 242粉丝 289原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值