HDU-3032--Nim or not Nim?(博弈+SG打表)
题目分析:
这是一个经典的Multi-SG游戏的问题。
相较于普通的Nim游戏,该游戏仅仅是多了拆成两堆这样的一个状态。即多了一个SG(x+y)的过程。
而根据SG定理,SG(x+y)这个游戏的结果可以拆成SG(x)和 SG(y)游戏的结果的xor。
因此,在我们求SG函数的过程中,我们只需要再枚举一下拆成两堆的状态,即可获得Multi-SG游戏每个状态的SG函数。
但是题目中的数据范围较大(达到了1e5的级别),因此我们考虑先打表找规律。打出SG函数后不难发现,存在规律:

顺着上面的规律即可求出每一个状态的SG函数,最后将这些SG函数结果全都xor起来即可。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 100;
typedef long long ll;
ll n, a[N];
string Answer[2] = { "Alice\n","Bob\n" };
ll gsg(int x) {
if (x % 4 == 0)return x - 1;
else if (x % 4 == 3)return x + 1;
else return x;
}
int main() {
//freopen("in.txt", "r", stdin);
ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int t; cin >> t;
while (t--) {
ll cnt = 0;
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
cnt ^= gsg(a[i]);
}
if (cnt == 0)cout << Answer[1];
else cout << Answer[0];
}
}
SG打表代码:
//SG打表的代码
const int maxn = 105;
int vis[maxn];
int sg[maxn];
void init() {//SG函数打表
for (int i = 0; i < 100; i++) {//枚举100个状态
memset(vis, 0, sizeof(vis));
for (int j = 1; j <= i; j++) {
vis[sg[i - j]] = true;
}
for (int j = 1; j < i; j++) {//枚举分成两块的状态
vis[sg[j] ^ sg[i - j]] = true;
}
for (int j = 0;; j++) {
if (!vis[j]) {
sg[i] = j;
break;
}
}
}
for (int i = 0; i < 100; i++) {
cout << i << " " << sg[i] << endl;
}
}
HDU-3032--Nim or not Nim?(博弈+SG打表)的更多相关文章
- HDU 1847-Good Luck in CET-4 Everybody!-博弈SG函数模板
Problem Description 大学英语四级考试就要来临了,你是不是在紧张的复习?也许紧张得连短学期的ACM都没工夫练习了,反正我知道的Kiki和Cici都是如此.当然,作为在考场浸润了十几载 ...
- 51nod_1714:B君的游戏(博弈 sg打表)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1714 nim游戏的一个变形,需要打出sg函数的表 #incl ...
- 51nod 1714:B君的游戏(博弈 sg打表)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1714 nim游戏的一个变形,需要打出sg函数的表 #incl ...
- hdu 2147 kiki's game(DP(SG)打表找规律)
题意: n*m的棋盘,一枚硬币右上角,每人每次可将硬币移向三个方向之一(一格单位):左边,下边,左下边. 无法移动硬币的人负. 给出n和m,问,先手胜还是后手胜. 数据范围: n, m (0<n ...
- hdu 3032 Nim or not Nim? (SG函数博弈+打表找规律)
Nim or not Nim? Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Sub ...
- HDU 3032 Nim or not Nim?(博弈,SG打表找规律)
Nim or not Nim? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- hdu 3032 Nim or not Nim? sg函数 难度:0
Nim or not Nim? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- HDU 3032 Nim or not Nim? (sg函数)
Nim or not Nim? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- HDU 3032 Nim or not Nim? (sg函数求解)
Nim or not Nim? Problem Description Nim is a two-player mathematic game of strategy in which players ...
- hdu 3032 Nim or not Nim?(搜索打SG表)
题意: 有n堆石子,alice先取,每次可以选择拿走一堆石子中的1~x(该堆石子总数) , 也可以选择将这堆石子分成任意的两堆.alice与bob轮流取,取走最后一个石子的人胜利. 思路: 因为数的范 ...
随机推荐
- logstash 配置文件语法介绍
大家好,我是蓝胖子,之前在构建服务监控实践那个系列里,有提到用logstash来做日志的收集,但是对于logstash的配置文件语法没有做很详细的介绍,今天就来详细聊聊logstash配置文件的语法. ...
- 浏览器跨 Tab 窗口通信原理及应用实践
最近,相信大家一定被这么个动效给刷屏了: 以至于,基于这个效果的二次创作层出不穷,眼花缭乱. 基于跨窗口通信的弹弹球: 基于跨窗口通信的 Flippy Bird: 我也尝试制作了一个跨 Tab 窗口的 ...
- 如何优雅而不损失性能的实现SpringCloud Gateway网关参数加解密方案
背景 为了增强产品安全性,计划对应用网关进行改造,主要是出入参经过网关时需要进行加解密操作,保证请求数据在网络传输过程中不会泄露或篡改. 考虑到密钥的安全性,每个用户登录都会签发独立的密钥对.同时摒弃 ...
- hexo+icarus博客搭建
展示效果:米七小站 环境准备 安装nodejs.git.hexo Hexo官网文档 Hexo初始化项目 $ hexo init myblog $ cd myblog $ yarn 查看效果 $ hex ...
- PolarCTF-2023冬季个人挑战赛 WP
Crypto 数星星 题目 小明暗恋小红很久了,终于在一个月黑风高的夜晚,决定约她出去数星星.小明数着数着,数出了一串数字,3,6,10,12,15,他觉得这是爱情的关键,思考了整整一晚上,小红很生气 ...
- 牛客小白月赛2 D题虚虚实实
题目链接:https://www.nowcoder.com/acm/contest/86/D 解题思路:这题目就是判断是否存在欧拉路径.由无向图存在欧拉路径的充分必要条件可知先判断是否联通,再判断是否 ...
- 数字孪生和GIS融合会为各自带来什么样的改变?
数字孪生和地理信息系统(GIS)是两个强大的技术,它们在各自领域发挥着重要作用.而当数字孪生与GIS融合时,将会为它们带来更加深远的改变和增益. 数字孪生技术以数字化的方式模拟和复制现实世界中的物理对 ...
- Sql整理
1:数据库 数据库是以某种有组织的方式存储的数据集合. 保存有组织数据的容器,通常是一个文件或者一组文件. SQL 是Structured Query Language (结构化查询语言)的缩写. 2 ...
- MySQL 事务的基础知识
事务的基础知识 1. 数据库事务概述 事务是数据库区别于文件系统的重要特性之一,当我们有了事务就会让数据库中的数据始终保持 一致性,同时我们还能通过事务的机制 恢复到某个时间地点的数据,这样可以保证已 ...
- 【scikit-learn基础】--『监督学习』之 LASSO回归
LASSO(Least Absolute Shrinkage and Selection Operator)回归模型一般都是用英文缩写表示,硬要翻译的话,可翻译为 最小绝对收缩和选择算子. 它是一种线 ...