• HDU1525 Euclid's Game


    题意:

    给你两个数n、m(假设n>m),问让n-k*m(k要保证n-k*m>=0),如果谁先减出来0的话谁就获得胜利

    题解:

    当n%m==0的时候先手获胜

    当n<2*m的时候,那么只能通过辗转相减来一步一步求结果

    当n>2*m的时候,先手获胜。假设这个时候我们已经知道了n%m与m这两个数是先手获胜还是后手获胜,假设是先手获胜,那么我们可以把n变成n%m+m

    这个时候后手只能是两个数变成(n%m,m),又因为这是一个必胜态,所以先手就获胜了(如果(n%m,m)是后手获胜,那么先手可以直接使(n,m)变成(n%m,m),又因为这是一个必输态且又轮到后手走,所以先手胜利)

    代码:

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<iostream>
     4 #include<algorithm>
     5 #include<math.h>
     6 #include<stack>
     7 #include<math.h>
     8 using namespace std;
     9 typedef long long ll;
    10 const int maxn=1000000;
    11 int main()
    12 {
    13     int n,m;
    14     while(~scanf("%d%d",&n,&m))
    15     {
    16         if(n==0 && m==0) break;
    17         if(n<m) swap(n,m);
    18         int flag=0;
    19         while(1)
    20         {
    21             if(n/m>=2 || n==m)
    22                 break;
    23             n-=m;
    24             swap(n,m); //因为剩下来的都是n/m<2的,所以每一次n-=m之后,n就小于m了
    25             flag^=1;
    26         }
    27         if(!flag) printf("Stan wins
    ");
    28         else printf("Ollie wins
    ");
    29     }
    30     return 0;
    31 }
    View Code
  • 相关阅读:
    【CF1029A】Many Equal Substrings(模拟)
    【CF1028C】Rectangles(线段树)
    【CF1028B】Unnatural Conditions(构造)
    【CF1028A】Find Square(签到)
    【CF1025C】Plasticine zebra(模拟)
    【CF1025A】Doggo Recoloring(签到)
    167.数据传送指令
    166.寻址方式
    165.基础
    164.多媒体操作系统
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/11344633.html
Copyright © 2020-2023  润新知