bzoj 1228 [SDOI2009]E&D SG函数打表 找规律
题目链接
Description
桌子上有2n 堆石子,编号为1..2n。将第2k-1 堆与第2k 堆(1 ≤ k ≤ n)为同一组。第i堆的石子个数用一个正整数Si表示。一次分割操作指的是,从桌子上任取一堆石子,将其移走。然后分割它同一组的另一堆石子,从中取出若干个石子放在被移走的位置,组成新的一堆。操作完成后,所有堆的石子数必须保证大于0。显然,被分割的一堆的石子数至少要为2。两个人轮流进行分割操作。如果轮到某人进行操作时,所有堆的石子数均为1,则此时没有石子可以操作,判此人输掉比赛。
例如,假设初始时桌子上有4 堆石子,数量分别为1,2,3,1。小E可以选择移走第1堆,然后将第2堆分割(只能分出1 个石子)。接下来,小W 只能选择移走第4 堆,然后将第3 堆分割为1 和2。最后轮到小E,他只能移走后两堆中数量为1 的一堆,将另一堆分割为1 和1。这样,轮到小W 时,所有堆的数量均为1,则他输掉了比赛。故小E 存在必胜策略。
Input
的第一行是一个正整数T(T ≤ 20),表示测试数据数量。接下来有T组数据。对于每组数据,第一行是一个正整数N,表示桌子上共有N堆石子。其中,输入数据保证N是偶数。第二行有N个正整数S1..SN,分别表示每一堆的石子数。
Output
包含T 行。对于每组数据,如果小E 必胜,则输出一行”YES”,否则输出”NO”。
Sample Input
2
4
1 2 3 1
6
1 1 1 1 1 1
Sample Output
YES
NO
思路
\((x,y)\)可以从\((1,x-1),(2,x-2),...,(x-1,1),(1,y-1),(2,y-2),...,(y-1,1)\)转移而来
据此打个\(SG\)函数的表,然后找规律
前20行20列如下表
0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 4 0 1 0 2
1 1 2 2 1 1 3 3 1 1 2 2 1 1 4 4 1 1 2 2
0 2 0 2 0 3 0 3 0 2 0 2 0 4 0 4 0 2 0 2
2 2 2 2 3 3 3 3 2 2 2 2 4 4 4 4 2 2 2 2
0 1 0 3 0 1 0 3 0 1 0 4 0 1 0 4 0 1 0 3
1 1 3 3 1 1 3 3 1 1 4 4 1 1 4 4 1 1 3 3
0 3 0 3 0 3 0 3 0 4 0 4 0 4 0 4 0 3 0 3
3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 3 3 3 3
0 1 0 2 0 1 0 4 0 1 0 2 0 1 0 4 0 1 0 2
1 1 2 2 1 1 4 4 1 1 2 2 1 1 4 4 1 1 2 2
0 2 0 2 0 4 0 4 0 2 0 2 0 4 0 4 0 2 0 2
2 2 2 2 4 4 4 4 2 2 2 2 4 4 4 4 2 2 2 2
0 1 0 4 0 1 0 4 0 1 0 4 0 1 0 4 0 1 0 5
1 1 4 4 1 1 4 4 1 1 4 4 1 1 4 4 1 1 5 5
0 4 0 4 0 4 0 4 0 4 0 4 0 4 0 4 0 5 0 5
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5
0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 5 0 1 0 2
1 1 2 2 1 1 3 3 1 1 2 2 1 1 5 5 1 1 2 2
0 2 0 2 0 3 0 3 0 2 0 2 0 5 0 5 0 2 0 2
2 2 2 2 3 3 3 3 2 2 2 2 5 5 5 5 2 2 2 2
发现$$sg[i][j]=k\rightarrow (i-1)%2{k+1}\lt2k,(j-1)%2{k+1}\lt2k$$
于是算\(sg\)值可以直接从小往大枚举幂次\(k\),符合条件就停。
时间复杂度\(O(1)\).
// 着实要锻炼眼力啊
Code
#include <bits/stdc++.h>
#define maxn 20
#define maxk 33
using namespace std;
typedef long long LL;
int sg[maxn+10][maxn+10];
bool vis[maxn+10];
void work() {
int n;
scanf("%d", &n);
n >>= 1;
int res = 0;
for (int i = 0; i < n; ++i) {
LL x, y;
scanf("%lld%lld", &x, &y);
--x; --y;
LL modd = 2, ans = 0;
for (int k = 0; k <= maxk; ++k) {
if (x % modd < (modd>>1) && y % modd < (modd>>1)) break;
modd <<= 1; ++ans;
}
res ^= ans;
}
puts(res ? "YES" : "NO");
}
void init() {
sg[1][1] = 0;
for (int i = 1; i <= maxn; ++i) {
for (int j = 1; j <= i; ++j) {
if (i==1&&j==1) continue;
memset(vis, 0, sizeof vis);
for (int k = 1; k < i; ++k) vis[sg[k][i-k]] = true;
for (int k = 1; k < j; ++k) vis[sg[k][j-k]] = true;
for (int k = 0; k <= maxn; ++k) if (!vis[k]) { sg[i][j] = sg[j][i] = k; break; }
}
}
// for (int i = 1; i <= maxn; ++i) {
// for (int j = 1; j <= maxn; ++j) printf("%d ", sg[i][j]); putchar('\n');
// }
}
int main() {
// freopen("out.txt", "w", stdout);
// init();
int T;
scanf("%d", &T);
while (T--) work();
return 0;
}
bzoj 1228 [SDOI2009]E&D SG函数打表 找规律的更多相关文章
- hdu 3032 Nim or not Nim? (sg函数打表找规律)
题意:有N堆石子,每堆有s[i]个,Alice和Bob两人轮流取石子,可以从一堆中取任意多的石子,也可以把一堆石子分成两小堆 Alice先取,问谁能获胜 思路:首先观察这道题的数据范围 1 ≤ N ...
- Light OJ 1296:Again Stone Game(SG函数打表找规律)
Alice and Bob are playing a stone game. Initially there are n piles of stones and each pile contains ...
- Playing With Stones UVALive - 5059 Nim SG函数 打表找规律
Code: #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; ll ...
- 【博弈论】【SG函数】【找规律】Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined) E. Game of Stones
打表找规律即可. 1,1,2,2,2,3,3,3,3,4,4,4,4,4... 注意打表的时候,sg值不只与剩下的石子数有关,也和之前取走的方案有关. //#include<cstdio> ...
- BZOJ 1228: [SDOI2009]E&D(SG定理)
这道嘛,很容易就看出是个nim和,然后问题就是怎么算子问题的sg函数了 先暴力个表看下规律,很容易就找出来了~~~(百度空间又渣了,图贴不出来= =) 32 0 1 0 2 0 1 0 3 0 1 0 ...
- 【博弈论】【SG函数】【找规律】Gym - 101147A - The game of Osho
以后这种题还是不能空想,必须打个表看看,规律还是比较好找的……具体是啥看代码.用SG函数暴力的部分就不放了. #include<cstdio> using namespace std; i ...
- Nim or not Nim? hdu3032 SG值打表找规律
Nim or not Nim? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- Educational Codeforces Round 68 (Rated for Div. 2)D(SG函数打表,找规律)
#include<bits/stdc++.h>using namespace std;int sg[1007];int main(){ int t; cin>>t; while ...
- hdu 2147 SG函数打表(手写也可以) 找规律
kiki's game Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 40000/1000 K (Java/Others) Total ...
随机推荐
- atm-interface-shopping
from db import db_handlerfrom interface import bank def shopping_interface(name, cost, shoppingcart) ...
- jquery/js/a标签实现当前页面跳转的两种方法
在逛购物网站首页时经常看到侧边导航栏,当我们点击导航栏中某一项时会跳转到当前页面的某一处 有两种方法实现,一种是利用js计算好各位置的高度,通过绑定事件使页面跳转到指定位置,另一种是利用a标签进行当前 ...
- html5支持drag的拖放排序插件sortable.js
html5支持drag的拖放排序插件sortable.js <script src="//cdnjs.cloudflare.com/ajax/libs/Sortable/1.5.1/S ...
- 面试前赶紧看了5道Python Web面试题,Python面试题No17
目录 本面试题题库,由公号:非本科程序员 整理发布 第1题: Flask中的请求上下文和应用上下文是什么? 第2题:django中间件的使用? 第3题: django开发中数据做过什么优化? 第4题: ...
- A1002 A+B for Polynomials (25)(25 分)
1002 A+B for Polynomials (25)(25 分) This time, you are supposed to find A+B where A and B are two po ...
- 03014_EL技术
1.EL表达式概述 EL(Express Language)表达式可以嵌入在jsp页面内部,减少jsp脚本的编写,EL出现的目的是要替代jsp页面中脚本的编写. 2.EL从域中取出数据(EL最重要的作 ...
- 洛谷P1067 多项式输出
题目链接:https://www.luogu.org/problemnew/show/P1067 这是一个纯模拟的小怪但是需要注意一些小细节: 1.首项为正没有+号. 2.所有项系数如果是一的话就省略 ...
- HashMap 简介
HashMap 前置条件 了解数组 了解链表 jdk version: 1.8 个人分3步来了解HashMap 通过数据结构图 通过为了完成这样的数据结构我们该怎么做 HashMap 实际put方法源 ...
- 【正则】对RegExp执行typeof运算的结果
对RegExp执行typeof运算的结果并不统一,在有些浏览器中返回“function”,在有些中返回“object”. 谷歌: 火狐 IE: **
- Group Policy Object Editor
Group Policy Object Editor The Group Policy Object Editor is a tool that hosts MMC extension snap- ...