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 ...
随机推荐
- Linux下面自动清理超过指定大小的文件
Linux下面自动清理超过指定大小的文件 思路:1)查找test目录下的所有的文件2)判断是否大于100M3)大于100M则清空 以byte为单位显示文件大小,然后和100M大小做对比. 100M换算 ...
- Redux百行代码千行文档
接触Redux不过短短半年,从开始看官方文档的一头雾水,到渐渐已经理解了Redux到底是在做什么,但是绝大数场景下Redux都是配合React一同使用的,因而会引入了React-Redux库,但是正是 ...
- PHP判断时关于null,0,true,flase的值
<?php// $wh = 0; //等于整数0,等于字符串'0',等于空字符串,等于空格字符串, 等于空(null),等于字符串('null')// $wh = '0'; //=>等于整 ...
- 使用shell脚本添加用户
该文演示如何使用shell脚本完成添加用户,首先进行一个判断,如果用户存在,提示该用户已经存在,否则进行添加新的用户. 示例代码如下: #!/bin/bash grep_user() { R=`gre ...
- (转)iOS静态库与动态库的区别
一.什么是库? 库是共享程序代码的方式,一般分为静态库和动态库. 静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝. 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用 ...
- ACM二分搜索中的最大化最小值 总结
这类题目都有个相似的地方就是需要你去找一个临界点. 分析题目要你求什么,例如时间 那么mid就是时间 看求得这个跟什么相关 例如 poj 3258 求得是距离 这个距离跟两者之间的差相关 那题目要求你 ...
- MySQL和PostgreSQL比较
1.MySQL相对来说比较年轻,首度出现在1994年.它声称自己是最流行的开源数据库.MySQL就是LAMP(用于Web开发的软件包,包括 Linux.Apache及Perl/PHP/Python)中 ...
- 10,Scrapy简单入门及实例讲解
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以 ...
- 网络安全巧设置 Win2008 R2 防火墙详解(1)
针对一般中小企业型来说,如果希望对企业网络进行安全管理,不一定非得花高价钱购买专业的防火墙设置,直接借助操作系统本身自带的防火墙功能即可以满足一般企业的应用,今天我们就一起来探究一下Windows S ...
- Java web学习总结
javaweb学习总结(十四)——JSP原理 孤傲苍狼 2014-07-24 09:38 阅读:46603 评论:37 JavaWeb学习总结(十三)——使用Session防止表单重复提交 孤 ...