Sept.25 Triangle Game

portkey

考场上因为读不懂题(再加上菜)就弃了
所以先给一点翻译
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)无论怎样操作都只能到达必胜态

  1. \(a=1\),则(b-1)^(c-1)==0,易知 \(b=c\),显然必败(已经可以停止证明了,因为先手都无法操作)
    先手将\(b\)减少,后手将\(c\)减少到相同值即胜利
  2. \(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\))性质

  1. 交换律:由定义易得。\(a\oplus b=b\oplus a.\)
  2. \(0\)异或:\(x\oplus 0=x.\)
  3. 结合律:\((a\oplus b)\oplus c=a\oplus(b\oplus c).\)
  4. 自反性:\(a\oplus b\oplus b=a.\) 证:\(a\oplus(b\oplus b)=a\oplus0=a\)
  5. 其他表示方法(对于二进制 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 \]

posted @ 2022-10-03 11:04  antimo  阅读(87)  评论(0)    收藏  举报