【博弈論】HDU - 7216 Triangle Game

Ke_scholar發表於2024-08-19

思路

先說結論:若 \((a-1)\otimes(b-1)\otimes (c-1)\ne 0\) 則先手必勝\(\otimes\) 代表異或)

假設 \(a\le b \le c\),那麼有 \(a+b\ge c\),則有 \((a-1)+(b-1)\ge (c-1)\)

\(x = (a-1)\otimes (b-1)\otimes (c-1)\)

\(x=0:\)

  • \(a=1\),那麼此時有 \((b-1)\otimes (c-1)=0\to a<b=c\)\(a\) 已經不能再減小了,此時無論減少 \(b\) 還是 \(c\) 都無發構成三角形。

  • \(a>1\),假設將 \(a\to a'\),此時有 \((a'-1)\ne (a-1)\to (a'-1)\otimes (b-1)\otimes (c-1)\ne 0\),即轉變到 \(x\ne 0\) 情況。

\(x\ne 0\):

  • 三個不等式必有一個成立 \((a-1)\otimes x < (a-1),(b-1)\otimes x < (b-1),(c-1)\otimes x < (c-1).\)
  • 因為 \(x\) 中的 \(1\)\((a-1),(b-1),(c-1)\) 由三者異或得到的,也就是一定是奇數次的 \(1\) 的個數,那麼不妨假設最高位的 \(1\) 是由 \((a-1)\) 提供的,(另外兩個即便也有 \(1\),也會因為異或偶數次而被抵消 ),那麼我們 \(x\) 的這一位上也一定有 \(1\),讓 \(x\otimes (a-1)\),就可以抵消最高位的 \(1\) ,使得其小於 \((a-1)\)。所以一定會存在由 \(x\ne 0\to x=0\) 的情況,也就是由必勝態轉向必敗態。

在兩人都採取最優策略的情況下,那麼先手就可以決定勝敗。

程式碼

#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

void solve() {

	int a, b, c;
	cin >> a >> b >> c;

	cout << ((a - 1) ^ (b - 1) ^ (c - 1) ? "Win" : "Lose") << '\n';

}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	int t;
	cin >> t;
	while (t--) {
		solve();
	}

	return 0;
}

相關文章