zoukankan      html  css  js  c++  java
  • HDU 1525 Euclid Game

    题目大意:

    给定2个数a , b,假定b>=a总是从b中取走一个a的整数倍,也就是让 b-k*a(k*a<=b)

    每人执行一步这个操作,最后得到0的人胜利结束游戏

    (0,a)是一个终止态P(必胜态)

    始终假设b>=a 

    那么(a,b)b%a==0 , 那么就是 必败态 N

    如果2*a>b>a 那么只能选择进入 (a , b-a)不确定什么状态

    因为每个人都很聪明,所以对于碰到一个a ,b的局面

    如果 b>a*2 , 那么应该知道 (a , b%a) 是不是一个必胜态,如果不是,那么这个聪明人就总会进入(a , b%a+a) ,就能逼迫对方进入 (a , b%a) 这个必败态

    如果 (a , b%a) 是一个必胜态,那么聪明人就会自己进入这个状态

    所以 b>2*a的时候,下个人肯定是必胜的,也就是下个人必然进入必胜态,所以这是一个必败态

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 using namespace std;
     5 
     6 bool dfs(int a , int b)
     7 {
     8     if(a>b) swap(a , b);
     9     if(a == 0) return true;
    10     if(b%a == 0 || b > 2*a) return false;
    11 
    12     bool flag1 = dfs(a , b%a);
    13     bool flag2 = false;
    14     if(b > 2*a) flag2 = dfs(a , b%a+a);
    15     if(flag1 || flag2) return false;
    16     return true;
    17 }
    18 
    19 int main()
    20 {
    21    // freopen("a.in" , "r" , stdin);
    22     int a,b;
    23     while(scanf("%d%d" , &a , &b) , a||b)
    24     {
    25         if(dfs(a , b)) puts("Ollie wins");
    26         else puts("Stan wins");
    27     }
    28     return 0;
    29 }
  • 相关阅读:
    leetcode 673. 最长递增子序列的个数 java
    leetcode 148. 排序链表 java
    leetcode 98. 验证二叉搜索树 java
    leetcode 29. 两数相除 java
    leetcode 234. 回文链表 java
    Valid Palindrome LeetCode Java
    Single Number II LeetCode Java
    Single Number LeetCode java
    Search in Rotated Sorted Array II LeetCode Java
    Search in Rotated Sorted Array leetcode java
  • 原文地址:https://www.cnblogs.com/CSU3901130321/p/4250681.html
Copyright © 2011-2022 走看看