威佐夫博弈 hdu1527 取石子游戏

传送门:点击打开链接

题意:轮流取石子。1.在一堆中取任意个数.2.在两堆中取相同个数。最后取完的人胜利,问先手是否必赢

思路:威佐夫博弈博弈,满足黄金分割,且每个数字只会出现一次。具体求法见代码

#include<map>
#include<set>
#include<cmath>
#include<ctime>
#include<stack>
#include<queue>
#include<cstdio>
#include<cctype>
#include<string>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#define fuck(x) cout<<"["<<x<<"]"
#define FIN freopen("input.txt","r",stdin)
#define FOUT freopen("output.txt","w+",stdout)
using namespace std;
typedef long long LL;

int main() {
    int a, b; //FIN;
    while(~scanf("%d%d", &a, &b)) {
        if(a >= b) swap(a, b);
        int k = b - a;
        int x = (sqrt(5.0) + 1) / 2 * k, y = x + k;
        if(a == x && b == y) printf("0\n");
        else printf("1\n");
    }
    return 0;
}


你可能感兴趣的:(威佐夫博弈 hdu1527 取石子游戏)