专栏文章
题解:P2252 [SHOI2002] 取石子游戏 |【模板】威佐夫博弈
P2252题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minfz4pf
- 此快照首次捕获于
- 2025/12/02 01:47 3 个月前
- 此快照最后确认于
- 2025/12/02 01:47 3 个月前
题目传送门
问题分析
游戏规则:
有两堆石子,每次可以从一堆中取任意多石子,或从两堆中取相同数量的石子。
胜利条件:
取走最后一颗石子者获胜。
关键发现:
若满足以下条件不管怎么拿都会输。
1.若两堆石子数量为
(a, b) 且 。2.当且仅当 时,当前玩家必败。
3.其中 是黄金比例 ,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 条评论,欢迎与作者交流。
正在加载评论...