題解 ARC131C Zero XOR
阿新 • • 發佈:2021-12-06
發現 \(n=1, 3\) 時先手必勝,嘗試證明 \(n\) 為奇數時先手必勝
若存在一個數等於當前序列的異或和,則能一擊必殺
否則若對手在這一步勝利當且僅當你們先後選的數 \(a, b\) 滿足 \(a\oplus b=sum\)
因為有奇數個數,所以至少存在一個數不被包含在任何這樣的數對裡,選擇一個這樣的數可以歸納到 \(n-2\) 的情況
於是 \(n\) 為奇數時先手必勝
考慮 \(n\) 為偶數時
發現若不能一擊必殺,則你選了一個數後對手會面臨一個 \(n\) 為奇數的先手必勝局面,則你必敗
點選檢視程式碼
#include <bits/stdc++.h> using namespace std; #define INF 0x3f3f3f3f #define N 400010 #define ll long long //#define int long long char buf[1<<21], *p1=buf, *p2=buf; #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf, 1, 1<<21, stdin)), p1==p2?EOF:*p1++) inline int read() { int ans=0, f=1; char c=getchar(); while (!isdigit(c)) {if (c=='-') f=-f; c=getchar();} while (isdigit(c)) {ans=(ans<<3)+(ans<<1)+(c^48); c=getchar();} return ans*f; } int n; int a[N], sum; signed main() { n=read(); if (n&1) {puts("Win"); return 0;} for (int i=1; i<=n; ++i) a[i]=read(), sum^=a[i]; for (int i=1; i<=n; ++i) if (a[i]==sum) {puts("Win"); return 0;} puts("Lose"); return 0; }