算法基础-数学知识-容斥原理、博弈论

news2024/9/23 23:27:55

容斥原理、博弈论

  • 容斥原理
    • 890. 能被整除的数(二进制状态压缩版本,复杂度多一个Om)
    • 890. 能被整除的数(dfs版本)
  • 博弈论
    • 无限制nim游戏
      • AcWing 891. Nim游戏
      • AcWing 892. 台阶-Nim游戏(待补)
    • 集合版本Nim游戏
      • AcWing 893. 集合-Nim游戏
      • AcWing 894. 拆分-Nim游戏(待补)

容斥原理

在这里插入图片描述
容斥原理可以画一个韦恩图来看各个集合的关系

890. 能被整除的数(二进制状态压缩版本,复杂度多一个Om)

#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;
typedef long long LL;
const int N = 17;
int p[N];
void solve()
{
    int n, m;
    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的n次方-1个集合
    {
        int t = 1, cnt = 0;
        for (int j = 0; j < m; ++ j)//判断是否乘上p[j]
        {
            if (i >> j & 1)
            {
                if ((LL)t * p[j] > n)
                {
                    t = -1;
                    break;
                }
                t *= p[j];
                cnt ++ ;
            }
        }
        if (t != -1)
        {
            if (cnt & 1) res += n / t;//奇数就加上,偶数就减去
            else res -= n / t;
        }
    }

    cout << res;
}
int32_t main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T = 1;
    //cin >> T;
    while (T --) solve();
    return 0;
}

890. 能被整除的数(dfs版本)

本题本质上就是一个枚举所有答案的过程,那么我们当然可以用dfs搜索到所有可能的方案

#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;
typedef long long LL;
const int N = 17;
int p[N];
int n, m;
int res = 0;
void dfs(int u, int t, bool add)
{
    if (u == m)
    {
        if (t == 1) return ;
        else 
        {
            if (add) res += n / t;
            else res -= n / t;
            return;
        } 
    }
    dfs(u + 1, t, add);//m个质数中不选择p[i]
    if ((LL)t * p[u] <= n)//m个质数中不选择p[i]
    {
        dfs(u + 1, t * p[u], !add);//本层选了一个数的话,下一层枚举的集合的add就要取反,因为容斥原理公式就是1个的+,2个的-,3个的+,每多选一个数字,加减号相反
    }
}
void solve()
{
    cin >> n >> m;
    for (int i = 0; i < m; ++ i) cin >> p[i];

    dfs(0, 1, false);
    cout << res;
}
int32_t main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T = 1;
    //cin >> T;
    while (T --) solve();
    return 0;
}

博弈论

在这里插入图片描述

  1. 为什么异或值=0先手必败?这个我没搞懂,我主要是记住这个结论
  2. 为什么异或值!=0先手必胜?
    因为它可以转化为对手先手必败的状态(异或值为0),推导如下
    在这里插入图片描述

无限制nim游戏

AcWing 891. Nim游戏

#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;
const int N = 1e5 + 10;
int a[N];
void solve()
{
   int n;
   cin >> n;
   for (int i = 0; i < n; ++ i) cin >> a[i];
   int t = 0;//异或运算里面的0相当于加法里面的0,乘法里面的1
   for (int i = 0; i < n; ++ i) 
   {
        t ^= a[i];
   }
   if (t) cout << "Yes" << endl;
   else cout << "No" << endl;
}
int32_t main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T = 1;
    //cin >> T;
    while (T --) solve();
    return 0;
}

AcWing 892. 台阶-Nim游戏(待补)

集合版本Nim游戏

AcWing 893. 集合-Nim游戏

  1. 集合版本Nim游戏的每一步有多种选择,但多种选择是被限制在一个选择集合中的(而不是随意拿多少个)。
  2. sg(起点) != 0说明 我经过若干步一定可以到达 sg = 0的点,即我还是可以操作的,如果sg(起点) = 0,那我没有任何操作空间,直接判负,即先手必败。
  3. 推荐看这个博客
    在这里插入图片描述
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <set>
using namespace std;
const int N = 1e4 + 10;
int s[N], f[N];//f可以不用,但可以起到剪枝的效果
int n, k;

int sg(int x)
{
    if (f[x] != -1) return f[x];
    
    set<int> S;
    for (int i = 0; i < k; ++ i)
        if(x >= s[i]) S.insert(sg(x - s[i]));//这里如果不判断x>=s[i]的话会影响后续路线的赋值,
                                        //本来下一层应该是1,2但是因为负数,变成了0, 1
                                        //那么本层本来是0的,递归回来的时候现在也会被影响变成了2
    
    for (int i = 0; i < k; ++ i)
    {
        if (S.count(i) == 0) return f[x] = i;
    }
}

void solve()
{
    memset(f, -1, sizeof f);
    cin >> k;
    for (int i = 0; i < k; ++ i) cin >> s[i];
    
    cin >> n;

    int x;
    int res = 0;
    while(n --)
    {
        cin >> x;
        res ^= sg(x);
    }

    if (res) cout << "Yes" << endl;
    else cout << "No" << endl; 

}
int32_t main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T = 1;
    //cin >> T;
    while (T --) solve();
    return 0;
}

AcWing 894. 拆分-Nim游戏(待补)

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

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

相关文章

Spring Boot集成Elasticsearch实战

文章目录 一、简介二、安装与配置Elasticsearch三、集成Spring Boot与Elasticsearch1. 添加依赖与配置文件2. 创建Elasticsearch数据模型3. 定义Elasticsearch仓库接口4. 实现Elasticsearch数据操作 四、基本查询与索引操作1. 插入与更新数据2. 删除数据与索引3. 条件查询与分页…

aarch64 arm64 部署 stable diffusion webui 笔记 【3】

接上篇 aarch64 arm64 部署 stable diffusion webui 笔记 【2】继续安装其他依赖 gfpgan-CSDN博客 source venv/bin/activate export LD_LIBRARY_PATH/usr/local/lib64:/usr/local/lib:/usr/lib64:/usr/lib ./webui.sh 离线安装记录 (venv) [yeqiangceph3 stable-diffusio…

人脸识别技术,如何解决学校门禁安全?

在当今社会&#xff0c;学校安全已经成为一个备受关注的议题&#xff0c;而门禁监控系统已经成为学校管理和保障学生安全的重要工具之一。随着社会的不断发展和技术的不断进步&#xff0c;学校不再只是知识传授的场所&#xff0c;它们也成为了数百、数千甚至数万学生和教职员工…

【Spring Boot】JPA — JPA入门

JPA简介 1. JPA是什么 JPA是Sun官方提出的Java持久化规范&#xff0c;它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据&#xff0c;通过注解或者XML描述“对象-关系表”之间的映射关系&#xff0c;并将实体对象持久化到数据库中&#xff0c;极大地简…

欧洲云巨头OVHcloud收购边缘计算专家 gridscale

边缘计算社区近日获悉&#xff0c;欧洲云巨头OVHcloud已进入全面收购德国公司 gridscale 的谈判&#xff0c;该公司是一家专门从事超融合基础设施的软件提供商。 此次战略收购将标志着 OVHcloud 的另一个重要里程碑&#xff0c;使该集团能够显着加速其地理部署&#xff0c;并进…

智能化时代与智慧化时代

当今社会正处于快速发展的时代&#xff0c;科技的进步给我们带来了许多前所未有的机遇和挑战。在这个过程中&#xff0c;我们正逐步迈向智能化时代和智慧化时代&#xff0c;这两个时代代表了技术发展的不同阶段和方向。让我们深入了解这两个时代的概念、特点以及它们对未来的意…

发布 VectorTraits v1.0,它是 C# 下增强SIMD向量运算的类库

发布 VectorTraits v1.0, 它是C#下增强SIMD向量运算的类库 VectorTraits: SIMD Vector type traits methods (SIMD向量类型的特征方法). NuGet: https://www.nuget.org/packages/VectorTraits/1.0.0 源代码: https://github.com/zyl910/VectorTraits 用途 总所周知&#x…

Java死锁的原因及解决方法

要想知道死锁出现的原因和解决方法&#xff0c;首先得知道什么是死锁&#xff0c;死锁是两个或两个以上的运算单元&#xff08;进程、线程或协程&#xff09;&#xff0c;互相持有对方所需的资源&#xff0c;导致它们都无法向前推进&#xff0c;从而导致永久阻塞的问题。从字面…

Spine2D骨骼动画播放器 - 微信小程序版

Spine2D骨骼动画播放器 - 微信小程序版 简介平台支持 界面预览使用说明演示视频 版本笨笨的小目标&#xff08;废话&#xff09;参考资料测试文件百度盘分享 相关文档 简介 本播放器是SpinePlayer的微信小程序版。由于官方并没有提供现成的运行库&#xff0c;只能自己改造。 设…

如何应用运营商大数据精准营销?

如何应用运营商大数据精准营销&#xff1f; 越来越多的企业逐渐觉察到运营商大数据所带来的商业价值&#xff0c;精准营销也被他们用的越来越娴熟。那么&#xff0c;企业的大数据精准营销该如何应用呢&#xff1f;想必是很多资源有限的中小型公司最想了解的。 一 数据驱动运营…

springCloud-LoadBalancer负载均衡

接上个博客springcloud-Eureka。 Eureka主要是如何通过eureka服务器进行服务注册与发现&#xff0c;也有简单的负载均衡&#xff0c;实际上它其中的负载均衡就是靠LoadBalancer实现的。 2020年前SpringCloud是采用Ribbon作为负载均衡实现&#xff0c;但是在2020后采用了LoadBal…

部署elasticsearch集群

创建es集群 编写一个docker-compose.yaml文件&#xff0c;内容如下 version: 2.2 services:es01:image: elasticsearch:7.12.1container_name: es01environment:- node.namees01- cluster.namees-docker-cluster- discovery.seed_hostses02,es03- cluster.initial_master_nod…

大数据安全 | (一)介绍

目录 &#x1f4da;大数据安全 &#x1f407;大数据安全内涵 &#x1f407;大数据安全威胁 &#x1f407;保障大数据安全 ⭐️采集环节安全技术 ⭐️存储环节安全技术 ⭐️挖掘环节安全技术 ⭐️发布环节安全技术 &#x1f407;大数据用于安全 &#x1f4da;隐私及其…

CSS笔记(黑马程序员pink老师前端)选择器,字体,文本属性,Emmet语法,元素显示模式,CSS背景

选择器 选择器分为基础选择器和复合选择器两大类。 基础选择器 包括:标签选择器、类选择器、id选择器和通配符选择器。 /*标签选择器 */p {color: red;}/*类选择器 */.classname {color: yellow;}/*id选择器 */#idname {color: blue;}/*通配符选择器&#xff0c;选择页面所有的…

核心实验10_hybrid(实现access和trunk功能)_ENSP

项目场景&#xff1a; 核心实验10_hybrid&#xff08;实现access和trunk功能&#xff09;_ENSP 用hybrid的属性 是否打标签来达到替代使用access或trunk接口的目的 实搭拓扑图&#xff1a; 具体操作&#xff1a; SW1: [sw1]vlan 10 [sw1-vlan10]int g0/0/1 [sw1-GigabitEther…

ChatGPT 超有用提示词 练习雅思口语

目录 Prompts &#x1f53b;作为一个英语口语老师和提高英语口语 方法1&#xff1a;口语简单练习 方法2&#xff1a;角色扮演练习口语 作为一个英语翻译/英语作文优化师/稿件校对 作为一个”职位”面试官 学习英文单词 演员 苏菲 玛索 阿尔弗雷多詹姆斯帕西诺 要孝顺…

LeetCode 1113.报告的记录

数据准备 Create table If Not Exists Actions (user_id int, post_id int, action_date date, action ENUM(view, like, reaction, comment, report, share), extra varchar(10)); Truncate table Actions; insert into Actions (user_id, post_id, action_date, action, ext…

Python用GAN生成对抗性神经网络判别模型拟合多维数组、分类识别手写数字图像可视化...

全文链接&#xff1a;https://tecdat.cn/?p33566 生成对抗网络&#xff08;GAN&#xff09;是一种神经网络&#xff0c;可以生成类似于人类产生的材料&#xff0c;如图像、音乐、语音或文本&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 相关视频 最近我们…

Unity 之 Material (材质)渲染3D对象的重要组件

文章目录 介绍一些代码例子 介绍 在Unity中&#xff0c;Material&#xff08;材质&#xff09;是一种用于渲染3D对象的重要组件。Material定义了对象的外观&#xff0c;包括其颜色、纹理、光照属性和反射等。以下是关于Material的详细介绍&#xff1a; 创建Material&#xff1…

IDEA报错:No valid Maven installation found

当我想要用maven进行clean的时候&#xff0c;发现报了这个错误&#xff0c;idea的event logs记录为 网上又说可能是因为你的maven环境没有配置好&#xff0c;我对我的maven进行了检查&#xff0c;发现是没有问题的&#xff0c;在这里提醒大家&#xff0c;如果你以前的项目maven…