前几天做过一道题目,是Nim游戏的一个扩展,也不能说扩展吧,只是说另一种常见的状态。

问题引入:

给定n堆石子,每堆石子有vi(1<=vi<=1e5) 个,每次可以取一堆中的一些石子,使得剩下的石子为1到vi/k个,为最后的是先手胜,还是后手胜,如果先手胜则输出相应的操作策略。

思考:

当k==2的时候,显然就退化成了la 5059 的题目,我们以此为基础来考虑,肯定要先计算出sg的函数表,然后观察规律,lrj在训练指南中说的很清楚,打表的规则也很简单,下面给出lrj所打出的表:
0 1 0 2 1 3 0 4 2 5
当然,lrj是从奇偶性来分析的,那么很容易得出
sg(x)=n%2==0?sg(n/2)这样的结论,因为k==2,刚好有一些特性被提现出来了。所以:

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
ll sg(ll n)
{return n%2==0 ? n/2 : sg(n/2);
}
int main()
{int T;scanf("%d",&T);while(T--){int n;ll x;scanf("%d",&n);ll ans=0;while(n--){scanf("%lld",&x);ans^=sg(x);}if(ans)printf("YES\n");elseprintf("NO\n");}return 0;
}

那么当k>2的时候,又该怎么去解决?难道比葫芦画瓢?要推出
sg=(n%k==0)?n/k:sg(n/k) 这样的结论,如果真的这样,我只能说比葫芦画瓢的能力只用在了记答案上,这种能力应该是一种分析该问题的方法,正确的解法无非是打sg表,寻找规律。

笔者随手推了一下,那么打出的表如下:

k==3: 0 1 2 0 3 4 1 5 6
k==4:0 1 2 3 0 4 5 6 1 7 8 9

可以发现,都有123456……这个序列,而再去翻看上面的n==2的情况,发现都存在这样的规律,但是,好像没什么用,具体编程还是没办法操作,再去细看,发现打断123456这个序列的的下标x都是x%k==1,而且去掉123456这样的数后得到的都是原序列,那么,也就是说,当x%k==1时,sg(x)=sg(x/k) 否则,这样的123456序列实际上是由x-阶梯层数得到的,什么是阶梯层数,当k==3的时候x=1,2,3就属于第一层,x=4,5,6 就属于第二层,那么容易得出:

x%k==1 ? sg(x/k) : x-x/k-(x%k!=0);

于是,上题的第二种解法为:

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
ll k=2;
ll sg(ll x){if (x==1) return 0;return x%k==1 ? sg(x/k) : x-x/k-(x%k!=0);
}
int main()
{int T;scanf("%d",&T);while(T--){int n;ll x;scanf("%d",&n);ll ans=0;while(n--){scanf("%lld",&x);ans^=sg(x);}if(ans)printf("YES\n");elseprintf("NO\n");}return 0;
}

而对于51nod中要求求必胜操作时,只需预处理一下sg值,然后枚举每一位根据sg值来逆推符合条件的x即可。

提交地址:
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1661

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
const int N=1e5+5;ll n,k,sl[N],sr[N],v[N],vt[N];
ll sg(ll x){if (x==1) return 0;return x%k==1 ? sg(x/k) : x-x/k-(x%k!=0);
}int main()
{sl[0]=sr[n+1]=0;cin>>n>>k;ll p=0,ans=0;for (int i=1;i<=n;i++){scanf("%lld",v+i);vt[i]=sg(v[i]);sl[i]=sl[i-1]^vt[i];}for (int i=n;i>=1;i--) sr[i]=sr[i+1]^vt[i];for (int i=1;i<=n;i++){ll tt=sl[i-1]^sr[i+1],tx=ceil(1.0*v[i]/k);if (v[i]==1||vt[i]<=tt) continue;ll ttl=(ll)(1.0*tt*k/(k-1)+1);if (ttl%k==1) ttl--;for (int j=0;j<64;j++){if (ttl>=tx) break;ttl=ttl*k+1;}if (ttl<v[i]&&sg(ttl)==tt){p=i;ans=ttl;break;}}if (sl[n]) cout<<"Alice "<<p<<" "<<ans<<endl;else puts("Bob");
}

Nim游戏的一个扩展——51nod 1661 黑板上的游戏+LA 5059 Playing With Stones相关推荐

  1. linux可以玩什么游戏_为什么我们要在Linux上玩游戏,与Icculus聊天等等

    linux可以玩什么游戏 开源游戏综述 2014年8月31日至9月6日,一周 在本周的开源游戏新闻综述中,我们看了一些用旧游戏组件制成的令人惊叹的灯,Linux Action Show与Ryan&qu ...

  2. 苹果如何把游戏隐藏在计算机里面,苹果桌面上的游戏怎么隐藏

    如何隐藏Apple手机的游戏?_ 现在许多孩子喜欢在Apple手机上玩游戏. 我相信许多成年人都想删除游戏,但经常删除并下载以比较"麻烦",让我们隐藏这些游戏! 步骤请看下面的介绍 ...

  3. 您的计算机屏蔽了vac系统.您无法再安全的服务器上进行游戏,csgo你不能在安全服务器上玩游戏的可能原因如下_csgo无法在安全服务器上游戏怎么办-系统城...

    csgo是一款第一人称电子竞技游戏,很多朋友都在玩,有的朋友在玩csgo的时候会遇到一个问题,那就是玩游戏的时候突然弹出一个窗口,上面提示"你不能在安全服务器上玩游戏的可能原因如下" ...

  4. android做一个坦克大战小游戏_一个 ECharts 做的猜数小游戏

    大概 1 年多之前,一位老同学找到我,问能不能帮他做一个非常简单的猜数字游戏,需求是这样的: 在 1 到 100 的整数里,随机选一个数字,让小朋友们猜: 如果猜错了,告知小朋友猜大了还是猜小了: 如 ...

  5. 太空java游戏_JavaSpaceWar 一个基于 语言编写的太空战争游戏,包含所有图像和声音资源,便 习理解使用 Game Program 238万源代码下载- www.pudn.com...

    文件名称: JavaSpaceWar下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 506 KB 上传时间: 2014-03-18 下载次数: 0 提 供 者: ...

  6. 《游戏设计艺术(第2版)》——学习笔记(7)第7章 游戏始于一个创意

    <游戏设计艺术(第2版)>学习笔记(7) 第7章 游戏始于一个创意 灵感 陈述问题 如何睡眠 你的无声伙伴 潜意识建议1:给予关注 潜意识建议2:记录你的创意 潜意识建议3:(明智的)满足 ...

  7. python编的游戏越玩越卡_用Python写游戏,不到十分钟就学会了

    安装pygame 本人电脑是windows 10.python3.6,pygame下载地址:pypi.python.org/pypi/Pygame- 请自行下载对应python版本的pygame 运行 ...

  8. python游戏代码运行不了_用Python写游戏,不到十分钟就学会了

    安装pygame 请自行下载对应python版本的pygame 运行以下命令 创建Pygame窗口及响应用户输入 新建一个文件夹alien_invasion,并在文件夹中新建alien_invasio ...

  9. Yield Guild Games 与游戏区块链 Oasys 合作,扩大区块链游戏规模

    Yield Guild Games(YGG)加入了充满抱负的 Oasys 验证者群体 , Oasys 是一个游戏区块链,旨在通过连接其生态系统内的不同游戏来建立一个去中心化的元宇宙.Oasys 验证者 ...

最新文章

  1. 用C语言解“求特殊方程得正整数解”题
  2. JQuery 总结(5) 总结各种小应用
  3. 常见的钓鱼招式,可千万别入坑哦
  4. 【算法学习笔记】83.排序辅助 动态规划 SJTU OJ 1282 修路
  5. java乒乓_Java -- 乒乓球 乒乓弹球游戏
  6. 洛谷P2480:古代猪文(中国剩余定理)(欧拉定理)
  7. rel=alternate stylesheet属性
  8. 提高代码的运行效率(1)
  9. Python 代码格式化工具 「Black」 使用详解(摘录翻译自官方文档)
  10. iphone拍照标注转发微博应用--Gurgle 发布
  11. 爬虫--电影天堂案例(二级页面抓取)
  12. F.conv2d pytorch卷积计算
  13. 大数据与人工智能专业都这么火,我们应该怎么选?
  14. NC 主子表增加页签
  15. 工程师的浪漫:用机械臂画一个爱心
  16. impala常见错误
  17. 阿里云服务器搭建java运行环境(jdk+mysql+tomcat)
  18. 如何使用JAVA代码生成一个简单的二维码
  19. elasticsearch优化总结
  20. 腾达Tenda路由器中继wifi步骤

热门文章

  1. Html5中的Video元素使用方法
  2. 搭建本地wordpress
  3. 链表!比数组更适合做增删操作的数据结构
  4. Hbase 的javaAPI基本操作用 在idea上的实现
  5. rds基于什么开发_IaaS、PaaS、SaaS、DaaS都是什么?现在怎么样了?终于有人讲明白了...
  6. fpu测试_I510400性能及温度测试详解
  7. 两个向量之间的夹角公式_向量的内积
  8. python 编码声明位置,python中的编码声明
  9. java bag_Java - T---bag - 博客园
  10. 大学物理质点动力学思维导图_生理学 | 思维导图