专栏文章

题解:P2252 [SHOI2002] 取石子游戏 |【模板】威佐夫博弈

P2252题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minfz4pf
此快照首次捕获于
2025/12/02 01:47
3 个月前
此快照最后确认于
2025/12/02 01:47
3 个月前
查看原文

题目传送门

问题分析

游戏规则: 有两堆石子,每次可以从一堆中取任意多石子,或从两堆中取相同数量的石子。
胜利条件:
取走最后一颗石子者获胜。
关键发现: 若满足以下条件不管怎么拿都会输。
1.若两堆石子数量为(a, b)aba \le b
2.当且仅当 a=kφ,b=a+ka = ⌊k\cdot \varphi⌋ , b = a + k 时,当前玩家必败。
3.其中 φ\varphi 是黄金比例 (5+121.618 (\frac{\sqrt{5}+1}{2} \approx 1.618 ,k 是正整数)。

Code:

CPP
#include <bits/stdc++.h>
#define int long long

using namespace std;

signed main() {
    int a, b;
    cin >> a >> b;
    
    if (a > b) swap(a, b);
    int k = b - a;
    
    // 计算 w = floor(k * phi),其中 phi = (1+sqrt(5))/2
    // 利用 phi 的性质:phi = 1 + 1/phi,且 w = (k * (sqrt(5) + 1)) / 2 的整数部分
    // 用高精度计算避免误差
    long double phi = (1.0L + sqrtl(5.0L)) / 2.0L;  // 用 long double 提高精度
    long double k_phi = k * phi;
    int w = (int)k_phi;
    if (w == a && k_phi < w + 1.0L) {
        cout << 0 << endl;
    } else {
        cout << 1 << endl;
    }
    
    return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...