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 }
  • 相关阅读:
    Codeforces 878A
    Codeforces 873B-Balanced Substring
    codeforces 868C
    51nod 1402 最大值(贪心)
    最小正子段和 贪心
    codeforces 819B
    Codeforces 785D
    Codeforces 864E
    863D
    UVA 1380 A Scheduling Problem
  • 原文地址:https://www.cnblogs.com/CSU3901130321/p/4250681.html
Copyright © 2011-2022 走看看