hdu 4664 划线(SG)
2024-10-13 21:55:45
N个平面,每个平面有ni个点 两个人玩游戏,划线,他们可以划任意一个平面的两个点,有以下要求:两个人划得线不能交叉,不要划已经划过的线,如果一个平面被划了一个空心的三角形,那么这个平面就不能继续划线了。Carol先来,两个人轮着画,谁没线划了就输了,问你最后谁赢。
一个平面上连接点时,不能连接已经有边的顶点,因为对方只需要再连接一次就可以组成一个三角形了
SG[i] i表示剩余没连线的点
0,1个点都是先手必败 SG=0 2,3个点先手必胜 SG[2] = 1 SG[3] = 1
假如 一个平面有4个点 则有以下后继状态
状态1 剩余的两点在已划线的同一侧 SG[0]^SG[2] = 1
状态2 剩余的两点分别在已划线的两侧 SG[1]^SG[1] = 0
所以SG[4] = 2 ;
打表后发现 前面是无序的 后面的SG值会出现长度为34的循环节
Sample Input
2 //T
1 //n
2 //每个平面有多少点
2
2 2
Sample Output
Carol
Dave
# include <iostream>
# include <cstdio>
# include <cstring>
# include <algorithm>
# include <string>
# include <cmath>
# include <queue>
# include <list>
# define LL long long
using namespace std ; const int MAXN = ;
int sg[MAXN];
bool vis[MAXN];
int mex(int x)
{ if(sg[x]!=-)return sg[x];
if(x == )return sg[x] = ;
if(x == )return sg[x] = ;
if(x == )return sg[x] = ;
if(x == )return sg[x] = ;
memset(vis,false,sizeof(vis));
for(int i = ;i < x-;i++)
vis[mex(i)^mex(x-i-)] = true;
for(int i = ;;i++)
if(!vis[i])
return sg[x] = i;
} int SG(int x)
{
if(x <= )return sg[x];
else
{
x %= ;
x += *;
return sg[x];
}
} int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
memset(sg,-,sizeof(sg));
for(int i = ;i <= ;i++)
{
sg[i] = mex(i);
}
int T;
int n;
int a;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
int sum = ;
for(int i = ;i < n;i++)
{
scanf("%d",&a);
sum ^= SG(a);
}
if(sum)printf("Carol\n");
else printf("Dave\n");
}
return ;
}
最新文章
- 【Alpha版本】冲刺-Day6
- curl post传递json数据
- MLlib--FPGrowth算法
- 微信开发中access_token,js_ticket,时间戳,签名生成工具
- 小程序蓝牙BLE——自动连接设备(手环)
- unity 中UGUI制作滚动条视图效果(按钮)
- quartz获取缓存中所有运行中的Job
- JAVA记录-redis缓存机制介绍(二)
- 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验五:按键模块④ &mdash; 点击,长点击,双击
- MySql.Data.MySqlClient连接MySql
- XiaoKL学Python(E)Generator Expressions
- dom操作------操作元素属性的若干方法
- OS X 10.11:如何完全停用Time Machine。
- length-of-last-word 最后一个单词的长度
- 01 Go 1.1 Release Notes
- Scrapy项目之User timeout caused connection failure(异常记录)
- AI落地企业业务的一些问题
- Mysql进阶-day1
- Linux 安装Zookeeper<;单机版>;(使用Mac远程访问)
- springmvc值传递