C++ 数论相关题目,博弈论,SG函数,集合-Nim游戏

给定 n

堆石子以及一个由 k

个不同正整数构成的数字集合 S

现在有两位玩家轮流操作,每次操作可以从任意一堆石子中拿取石子,每次拿取的石子数量必须包含于集合 S

,最后无法进行操作的人视为失败。

问如果两人都采用最优策略,先手是否必胜。

输入格式

第一行包含整数 k

,表示数字集合 S

中数字的个数。

第二行包含 k

个整数,其中第 i

个整数表示数字集合 S

中的第 i

个数 si

第三行包含整数 n

第四行包含 n

个整数,其中第 i

个整数表示第 i

堆石子的数量 hi

输出格式

如果先手方必胜,则输出 Yes。

否则,输出 No。

数据范围

1≤n,k≤100

,

1≤si,hi≤10000

输入样例:

2

2 5

3

2 4 7

输出样例:

Yes

SG函数:表示当前状态所不能到达状态中最小的自然数。

必胜状态:SG不等于0;

必败状态:SG等于0。

如果有多个图,将每个初始的SG值异或,等于0必败,不等于0必胜。

cpp 复制代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_set>

using namespace std;

const int M = 110, N = 10010;

int m, n;
int s[M], f[N]; //s存可以取的数,f表明一个状态的sg值,一个状态是一个数,一个确定石子个数的堆可以分解成一个图表示状态。

int sg(int x)
{
    if(f[x] != -1) return f[x]; //避免重复计算,如果x状态算过的话,就直接返回这个状态的sg值
    
    unordered_set<int> S;//存能到达的状态的sg值。
    for(int i = 0; i < m; i ++ ) //遍历每一个图(堆,石子堆)
        if(x >= s[i])
            S.insert(sg(x - s[i]));
    
    for(int i = 0; ; i ++ )
        if(!S.count(i)) //找到最小的不存在的状态自然数,说明当前状态的sg值就是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;
    while(n -- )
    {
        int x;
        cin>>x;
        res ^= sg(x);
    }
    
    if(res) puts("Yes");
    else puts("No");
    
    return 0;
}
相关推荐
学习星球8 分钟前
AI 一句话生成 3D 游戏世界:腾讯 HY-World 2.0 开源深度解析与本地实战
开发语言·人工智能·游戏·3d·ai·课程设计·ai编程
名字还没想好☜10 分钟前
Go 用 -race 抓数据竞争:一个偶发崩溃的排查、原理与修复
开发语言·后端·golang·go
励志不掉头发的内向程序员11 分钟前
LibreCAD 2D架构】从鼠标点击到屏幕像素:LibreCAD绘图架构全链路解析之鼠标事件与RS_ActionDrawLine
c++·qt·学习·架构·计算机外设
旖旎夜光15 分钟前
LeetCode 525:连续数组(前缀和) —— 题解
数据结构·c++·算法·leetcode·前缀和
fpcc20 分钟前
c++编程实践—如何理解生命周期
c++
小灰灰搞电子21 分钟前
Rust std::vec::Vec<T>动态数组:所有相关 API 全面介绍
开发语言·rust
学习星球24 分钟前
CodeWhale 深度剖析:从 DeepSeek-TUI 到 40.9K Star 的 Rust 终端编程 Agent
开发语言·后端·rust
乌萨达31 分钟前
梦幻新诛仙轻享电脑版怎么玩?模拟器安装与设置指南
游戏·安卓模拟器·雷电模拟器
曹牧1 小时前
C#:线程间操作无效,不是从创建控件线程访问
开发语言·c#
承渊政道3 小时前
【Python编程—从入门到实践】(Python条件判断完全入门:从布尔表达式到列表中的if实战)
开发语言·python·pycharm·条件判断·布尔表达式