算法学习16:数论03(容斥原理、博弈论)

news2024/11/25 22:35:42

算法学习16:数论03(容斥原理、博弈论)


文章目录

  • 算法学习16:数论03(容斥原理、博弈论)
  • 前言
  • 一、容斥原理:求多个集合的并集
  • 二、博弈论
    • 1.Nim游戏:
    • 2.集合N-im游戏
  • 总结


前言

在这里插入图片描述


提示:以下是本篇文章正文内容:

一、容斥原理:求多个集合的并集

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

// 例题:给定n和m个不同的质数p1,p2,...,pm
// 请你求出1~n中能被p1,p2,...,pm中至少被一个数整除的有多少个?
#include <iostream>
#include <algorithm>

using namespace std;

typedef long long LL;

const int N = 20;

int n, m;
int p[N];// 存储输入的m个质数 

int main()
{
	cin >> n >> m;
	for(int i = 0; i < m; i ++) cin >> p[i];
	
	int res = 0;
	for(int i = 1; i < 1 << m; i ++)// 循环 2^m-1 次 
	{
		int t = 1, cnt = 0;// t:标志,cnt:判断 奇 还是 偶 集合 
		for(int j = 0; j < m; j ++)
			if(i >> j & 1)
			{
				cnt ++;
				// 分母比分子大,跳 
				if((LL)t * p[j] > n)
				{
					t = -1;
					break;
				}
				t *= p[j];// 计算分母 
			}
		if(t != -1)
		{
			if(cnt % 2) res += n / t;// 奇 正 
			else res -= n / t;// 偶 负 
		}
	}
	cout << res << endl;
	return 0;
 } 

在这里插入图片描述

二、博弈论

1.Nim游戏:

在这里插入图片描述
在这里插入图片描述

// Nim游戏:给定n堆石子,两位玩家轮流操作,
// 每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),
// 最后无法进行操作的人视为失败。
// 问:如果两人都采用最优策略,先手是否必胜

/*
先手必胜状态:可以走到一个让对手必败的状态 
先手必败状态: 走不到一个可以让自己必胜的状态,找不到对方必败的机会 
*/

/*
输入:第一行包含整数n,第二行包含n个数字,第i个数字表示第i堆石子的数量
输出:Yes,No(能否先手必胜) 
*/

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
	int n;
	int res = 0;
	
	scanf("%d", &n);
	while(n --)
	{
		int x;
		scanf("%d", &x);
		res ^= x;
	}
	
	if(res) puts("Yes");// 不为0 
	else puts("No");// 为0 
	return 0;
 } 

在这里插入图片描述



2.集合N-im游戏



在这里插入图片描述



在这里插入图片描述



// 集合-Nim游戏:给定n堆石子和一个有k个不同正整数构成的数字集合S
// 现在两位玩家轮流操作,每次操作可以从任意一堆石子中拿取石子,
// 每次拿取的石子数量必须包含于集合S,最后无法进行操作的人视为失败
// 问两人都采用最优策略,先手是否必胜

#include <iostream>
#include <algorithm>
#include <cstring>
#include <unordered_set>

using namespace std;

const int N = 110,  M = 10010;

int n, m;
int s[N], f[N];// s:每次拿s[i]个石子,f:记忆化存储 

int sg(int x)
{
	// 记忆化搜索,已经有的元素,直接返回 
	if(f[x] != -1) return f[x];
	
	unordered_set<int> S;// 存储sg(x)可能的情况 
	// x的下一个状态!!!(重点) 
	for(int i = 0; i < m; i ++)
	{
		int sum = s[i];
		if(x >= sum) S.insert(sg(x - sum));
	}
	// mex操作: 
	for(int i = 0; ; i ++)
		if(!S.count(i)) return f[x] = i;
}

int main()
{
	cin >> m;
	for(int i = 0; i < m; i ++) cin >> s[i];
	cin >> n;
	
	memset(f, -1, sizeof f);
	
	int res = 0;
	for(int i = 0; i < n; i ++)
	{
		int x;
		cin >> x;
		res ^= sg(x);// 所有数异或 
	}
	// 不为0:先手必胜 
	if(res) puts("Yes");
	else puts("No");
	return 0;
}

在这里插入图片描述


总结

提示:这里对文章进行总结:

💕💕💕

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

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

相关文章

南京观海微电子---Vitis HLS设计流程介绍——Vitis HLS教程

1. 传统的FPGA设计流程 传统的RTL设计流程如下图所示&#xff1a; 传统的FPGA RTL设计流程主要是采用VHDL、VerilogHDL或System Verilog进行工程的开发&#xff0c;同时也是通过硬件描述语言来编写测试案例&#xff08;Test Bench&#xff09;对开发的工程进行仿真验证。 随后…

教你一键轻松领取腾讯云优惠券

随着云计算的普及&#xff0c;越来越多的企业和个人开始使用云服务。而在众多云服务提供商中&#xff0c;腾讯云凭借其优质的服务和丰富的产品赢得了广大用户的青睐。为了吸引更多的用户上云&#xff0c;腾讯云推出了优惠券活动&#xff0c;让用户在购买云服务时能够获得更多实…

如何使用Axure RP制作网页原型并结合IIS服务实现公网访问本地HTML网页

文章目录 前言1.在AxureRP中生成HTML文件2.配置IIS服务3.添加防火墙安全策略4.使用cpolar内网穿透实现公网访问4.1 登录cpolar web ui管理界面4.2 启动website隧道4.3 获取公网URL地址4.4. 公网远程访问内网web站点4.5 配置固定二级子域名公网访问内网web站点4.5.1创建一条固定…

Go的数据结构与实现【Binary Search Tree】

介绍 本文用Go将实现二叉搜索树数据结构&#xff0c;以及常见的一些方法 二叉树 二叉树是一种递归数据结构&#xff0c;其中每个节点最多可以有两个子节点。 二叉树的一种常见类型是二叉搜索树&#xff0c;其中每个节点的值都大于或等于左子树中的节点值&#xff0c;并且小…

【JavaWeb】Day28.SpringBootWeb请求响应——请求(一)

前言&#xff1a; 我们在开发web程序时呢&#xff0c;定义了一个控制器类Controller&#xff0c;请求会被部署在Tomcat中的Controller接收&#xff0c;然后Controller再给浏览器一个响应。 而在请求响应的过程中是遵循HTTP协议的。 但是&#xff0c;在Tomcat这类Web服务器中&a…

redis学习-redis配置文件解读

目录 1.单位说明 2. include配置 3. network网络配置 3.1 bind绑定ip配置 3.2保护模式protected-mode配置 3.3端口号port配置​编辑 3.4超时断开连接timeout配置 4. general通用配置 4.1守护进程模式daemonize配置 4.2进程id存放文件pidfile配置 4.3日志级别loglevel配置 4.…

揭秘汽车制造神器:DeviceNET转Modbus TCP神操作

在现代汽车制造行业&#xff0c;汽车零部件的高效生产与精准控制是至关重要的。为了实现这一目标&#xff0c;上位机通过DeviceNET转Modbus TCP网关的技术应用越来越受到重视。这种技术不仅提高了生产线的自动化程度&#xff0c;而且确保了数据的准确传输和处理&#xff0c;为汽…

C++中的string类模拟实现

目录 string类的模拟实现 string类的构造函数 string类拷贝构造函数 string类析构函数 string类c_str()函数 string类中的[]运算符重载函数 string类中的赋值运算符重载 string类中获取字符串有效字符个数 string类中获取字符串存储空间大小&#xff08;不包括\0&…

力扣 1035. 不相交的线

题目来源&#xff1a;https://leetcode.cn/problems/uncrossed-lines/description/ C题解&#xff1a;经过细细一推导&#xff0c;就发现跟力扣 1143. 最长公共子序列-CSDN博客 换汤不换药。 直线不能相交&#xff0c;说明元素顺序不能改变&#xff0c;求可以绘制的最大连线数…

设计方案-定时任务接口数据存储及更新策略

前言 在没有使用ETL工具且不考虑多数据源的情况下&#xff0c;我们需要从别的系统获取数据时&#xff0c;一般会选择分页接口查询并存储。本文算是我对类似场景代码的提炼&#xff0c;旨在总结相关套路&#xff0c;提升自我对数据库和模块的设计能力。 ETL(英文 Extract-Trans…

LeetCode Python - 81. 搜索旋转排序数组 II

目录 题目描述解法运行结果 题目描述 已知存在一个按非降序排列的整数数组 nums &#xff0c;数组中的值不必互不相同。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转 &#xff0c;使数组变为 […

社交网络的未来:Facebook如何塑造数字社交的下一章

引言 社交网络已成为我们生活中不可或缺的一部分&#xff0c;而Facebook作为其领军者&#xff0c;一直在塑造着数字社交的未来。本文将深入探讨Facebook在未来如何塑造数字社交的下一章&#xff0c;并对社交网络的发展趋势进行展望和分析。 1. 引领虚拟社交的潮流 Facebook将…

vulnhub靶场之driftingblues-4

一.环境搭建 1.靶场描述 get flags difficulty: easy about vm: tested and exported from virtualbox. dhcp and nested vtx/amdv enabled. you can contact me by email for troubleshooting or questions. This works better with VirtualBox rather than VMware. 2.靶场…

O(1)空间复杂度反转/逆置单链表

写法1 王道书上的 从头结点开始&#xff0c;将链表中的每个节点取下来&#xff0c;逐个放在头结点后面&#xff0c; 维护三个指针 p,q,r &#xff0c;p指向头结点&#xff0c;q为当前操作节点&#xff0c;r为下一个节点 将q指向p的下一个节点&#xff08;也就是反转后的第一…

CSS3新增的语法(三)

CSS3新增的语法&#xff08;三&#xff09; 10.2D变换10.1. 2D位移10.2. 2D缩放10.3. 2D旋转10.4. 2D扭曲&#xff08;了解&#xff09;10.5. 多重变换10.6. 变换原点 11. 3D变换11.1. 开启3D空间11.2. 设置景深11.3. 透视点位置11.4. 3D 位移11.5. 3D 旋转11.6. 3D 缩放11.7. …

【数据结构与算法初阶(c语言)】插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序、计数排序-全梳理(万字详解,干货满满,建议三连收藏)

目录 1.排序的概念及其运用 1.1排序的概念 1.2排序运用 1.3常见的排序算法 2.插入排序 2.1 原理演示&#xff1a;​编辑 2.2 算法实现 2.3 算法的时间复杂度和空间复杂度分析 3.希尔排序 3.1算法思想 3.2原理演示 3.3代码实现 3.4希尔算法的时间复杂度 4.冒泡排序 4.1冒泡排…

win11运行vmware报错“此平台不支持虚拟化的 amd-v/rvi”问题(已解决)

背景&#xff1a; Windows11 安装vmware17 player运行eve需要打开there &#xff08;reference:https://docs.vmware.com/cn/VMware-Workstation-Player-for-Windows/17.0/com.vmware.player.win.using.doc/GUID-3140DF1F-A105-4EED-B9E8-D99B3D3F0447.html&#xff09; 但是…

基于ARM内核的智能手环(day4)

回顾 单片机延时方法总结 空函数延时(delay) 使用空函数来进行延时操作。简单易用&#xff0c;但延时时间不够精确&#xff0c;且阻塞式。定时器延时(delay) 通过定时器的计数器进行延时操作&#xff0c;提供精确的延时时间&#xff0c;但是仍为阻塞式延时。定时器中断延时 利…

小白学Java成长日记第二篇

哈喽&#xff0c;小伙伴们&#xff0c;我又回来了&#xff0c;还记得上一篇我们讲了什么内容吗&#xff1f;what!你说已经忘记了&#xff1f;&#xff0c;没事那我们先复习一下吧。 上集回顾&#xff1a; Java的两层皮&#xff08;主体架构&#xff09;&#xff1a; public …

Python绘制线图之plt.plot()的介绍以及使用

在Python中plt.plot是matplotlib库中的一个函数,用于绘制点和线,并对其样式进行控制,下面这篇文章主要给大家介绍了关于Python绘制线图之plt.plot()的介绍以及使用的相关资料,需要的朋友可以参考下 plt.plot() 是Matplotlib库中用于绘制线图&#xff08;折线图&#xff09;的主…