题目链接:http://poj.org/problem?id=2348

题目大意:给你两个数a,b,Stan和Ollie轮流操作,每次可以将较大的数减去较小的数的整数倍,相减后结果不能小于0,谁先将其中一个数字变成0谁就获胜。

解题思路:看了挑战程序设计上的,这里我们先假设a<b,当b是a的整数倍是必胜态。我们讨论以下b不是a的整数倍,此时a,b的关系按照自由度的观点(第一次听说),可以分为以下两种情况:

     ①b-a<a

     ②b-a>a

那么对于①,玩家只有从b中减去a这一个选择。如果b-a得到的状态是必败态,那当前就是必胜态,反之,就是必败态。例如从(4,7)出发,只有(4,7)->(4,3)->(1,3)这一条路,(4,7)是必胜态。

但是对于②,有从b中减去a,2a或者更高的倍数等多种选择。假设x是使得b-a*x<a,我们考虑一下两种情况:

    1)将b-a*(x-1),得到状态①。

    2)将b-a*x,不能确定是状态①还是②。

并且我们可以发现,b-a*x是b-a*(x-1)唯一能转移到的状态,如果b-a*(x-1)是必胜态,那就执行b-a*(x-1),但如果是必败态呢,那b-a*x是就是必胜态。所以无论如何只要到了状态②就肯定会赢。

所以我们得到了结论:从初始状态开始最先到达自由度的第二种状态或者得到b是a的整数倍的一方必胜。

代码:

 #include<cstdio>
#include<algorithm>
using namespace std; int main(){
int a,b;
while(~scanf("%d%d",&a,&b)&&(a||b)){
int cnt=;
while(){
cnt++;
if(a>b)
swap(a,b);
if(b%a==)
break;
if(b-a>a)
break;
b-=a;
}
if(cnt&) puts("Stan wins");
else puts("Ollie wins");
}
}

最新文章

  1. 如何知道SQL Server机器上有多少个NUMA节点
  2. 发布Live Writer代码着色插件CNBlogs.CodeHighlighter
  3. Angularjs学习笔记(五)----显示和格式化数据
  4. App接口中xml方式封装通信接口
  5. linux下find查找命令用法
  6. sql快捷键
  7. LintCode-不同的子序列
  8. 数娱科技:借助VR技术可让你了解自己的大脑
  9. AI 人工智能 探索 (八)
  10. hdu_2030
  11. SpringMVC之简单的增删改查示例(SSM整合)
  12. CentOS7、REHL7的firewalld防火墙使用简单说明
  13. window bat 切换目录并执行php文件
  14. JS调用函数时候加括号与只写函数名字的区别 fn与fn()的区别
  15. C# 里调用vb的inputbox弹出窗
  16. 关于inode&amp;硬连接
  17. 【树莓派】crontab的两个问题
  18. Divisibility by Eight---cf550C(被8整除 暴力)
  19. iOS 性能监测
  20. Py修行路 python基础 (十二) 协程函数应用 列表生成式 生成器表达式

热门文章

  1. Codeforces Round #431
  2. BZOJ 1070 修车 【费用流】
  3. 洛谷 P4319 变化的道路 解题报告
  4. 【原创】【目录】实现rich editor(富文本编辑器)教程,深入理解selectiona/range操作与浏览器差异
  5. Spring MVC 向前台页面传值-ModelAndView
  6. Java--Inheritance constructor继承中的构造方法问题(二)
  7. HDU 3480 斜率dp
  8. Ubuntu在vncviewer下Tab键失效
  9. mysql日志配置
  10. 电商网站中价格的精确计算(使用BigDecimal进行精确运算(实现加减乘除运算))