Sept.25 Triangle Game
考场上因为读不懂题(再加上菜)就弃了
所以先给一点翻译
non-degenerate 不-除掉|生成的 不退化的
non-degenerate triangle 不退化三角形,就是存在的三角形,满足三边\(a+b\geq c\)
然后题目就涉及到奇奇怪怪的博弈论知识了
不会
但最简单的证明还是看得懂
大佬说目前我的水平想不出来那就不必想出来吧,自己写一遍证明还是很有收获的
一个必胜态一定能够经过一次操作到达必败态,而一个必败态无论怎样操作都只能到达必胜态。
——来自博弈论知识
结论:先手胜当且仅当(a-1)^(b-1)^(c-1)!=0
证明如下
不妨设\(a\le b\le c\)
第一,一个必败态(即(a-1)^(b-1)^(c-1)==0)无论怎样操作都只能到达必胜态
- 若\(a=1\),则
(b-1)^(c-1)==0,易知 \(b=c\),显然必败(已经可以停止证明了,因为先手都无法操作)
先手将\(b\)减少,后手将\(c\)减少到相同值即胜利 - 若\(a\neq 1\),则有\(1<a<b<c\),如果将\(a\)减小为\(x\),则一定有
(x-1)^(b-1)^(c-1)!=0,为必胜态
对\(b\)与\(c\)操作也是这个结果
第二,一个必胜态一定能够经过一次操作到达必败态
设x=(a-1)^(b-1)^(c-1),将 \(a-1\) 变为 (a-1)^x,则 \(a\) 变为 (a-1)^x+1,那么此时(a-1)^(b-1)^(c-1)==0,为必败态(对\(b,c\)同理,当然一次只能操作一个数)
那么就需要知道是否能使(a-1)^x+1<a
找到\(x\)的最高位,这个 \(1\) 在 \(a-1,b-1,c-1\) 的对应位上一定出现了奇数次,选择这个位上为 \(1\) 的数进行操作就可以使得这个数减小,因此是可以使(a-1)^x+1<a的(\(a\)取\(a,b,c\))
证毕
多打几个括号啊😭位运算的优先级真是捉摸不透
#include<bits/stdc++.h>
using namespace std;
#define in Read()
int in{
int i=0,f=1; char ch=0;
while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if(ch=='-') f=-1, ch=getchar();
while('0'<=ch&&ch<='9') i=(i<<1)+(i<<3)+ch-48, ch=getchar();
return i*f;
}
int main(){
freopen("1.in","r",stdin);
int T=in;
while(T--){
int a=in,b=in,c=in;
if(((a-1)^(b-1)^(c-1))!=0) puts("Win");
else puts("Lose");
}
return 0;
}
普及一波异或(数学符号\(\oplus\))性质
- 交换律:由定义易得。\(a\oplus b=b\oplus a.\)
- 与\(0\)异或:\(x\oplus 0=x.\)
- 结合律:\((a\oplus b)\oplus c=a\oplus(b\oplus c).\)
- 自反性:\(a\oplus b\oplus b=a.\) 证:\(a\oplus(b\oplus b)=a\oplus0=a\)
- 其他表示方法(对于二进制 1 位数):\(a\oplus b=(a+b)\%2=(\lnot a\land b)\lor(a\land\lnot b)\)
结合律的证明:
\[(a\oplus b)\oplus c=((a+b)\mod2+c)\mod 2=(a+b+c)\mod 2\\
a\oplus (b\oplus c)=(a+(b+c)\mod 2)\mod 2=(a+b+c)\mod 2
\]

浙公网安备 33010602011771号