博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 768E:Game of Stones
阅读量:6112 次
发布时间:2019-06-21

本文共 815 字,大约阅读时间需要 2 分钟。

Codeforces 768E:Game of Stones

题目链接:

题目大意:给定$n$堆石子,初始每堆$s_i$个石子.每次可从其中一堆中取任意$x(x \leqslant s'_i)$个石子,每堆石子若之前取过$x$个则不能再取$x$个(可以取$x+t$个,其中$t \neq 0$且$x+t \leqslant s'_i$).若不能取石子则判定为输,问后手是赢还是输.

nim博弈

我们将整个博弈游戏看做由$n$个博弈游戏组成,考虑仅有一堆$s_i$个石子的情况。

设$sg[i]$为仅有一堆i个石子的胜利态级数,由于有不能取重复个数的条件限制,

故$sg[i+j]=max\{sg[i]+1|j \notin \{a_k|i=sum_{k=1}^{sg[i]}a_k$,且$a_x \neq a_y\}$.

所以$sg[i]=p$,其中$p$为将$i$划分成若干个不同整数之和的划分数。

求出$sg[i]$后,将所有堆的胜利态级数异或后即得到总游戏的胜利态级数。

代码如下:

1 #include 
2 using namespace std; 3 int sg[65],k=1,n,t,ans; 4 int main(void){ 5 for(int i=1;i<=60;++i){ 6 if(i==(k+2)*(k+1)/2)k++; 7 sg[i]=k; 8 } 9 cin>>n;10 while(n--){11 cin>>t;12 ans^=sg[t];13 }14 if(ans)cout<<"NO";15 else cout<<"YES";16 }

 

转载于:https://www.cnblogs.com/barrier/p/6433245.html

你可能感兴趣的文章
汉字转拼音 (转)
查看>>
Machine Learning Techniques -6-Support Vector Regression
查看>>
会计基础_001
查看>>
Cordova 开发环境搭建及创建第一个app
查看>>
ajax请求拿到多条数据拼接显示在页面中
查看>>
小程序: 查看正在写的页面
查看>>
dedecms生成文档数据库崩溃 mysql daemon failed to start
查看>>
Linux的50个基本命令
查看>>
Objective-C中创建单例方法的步骤
查看>>
[转]无法安装MVC3,一直卡在vs10-kb2483190
查看>>
Codeforces 520B:Two Buttons(思维,好题)
查看>>
web框架-(二)Django基础
查看>>
Jenkins持续集成环境部署
查看>>
emoji等表情符号存mysql的方法
查看>>
Excel到R中的日期转换
查看>>
检查磁盘利用率并且定期发送告警邮件
查看>>
MWeb 1.4 新功能介绍二:静态博客功能增强
查看>>
linux文本模式和文本替换功能
查看>>
Windows SFTP 的安装
查看>>
摄像机与绕任意轴旋转
查看>>