コンセプト
A.勝利状態と失う状態
- ウィン状態(N)、勝つこの状態に直面している下で、最適な戦略。
- この状態を失うことになる、最適な政策に直面している状態(P)を、失います。
二.SG機能
- MEX操作:最小要件は非負整数のセットに属していないと定義されます。
- SG(x)は、xは状態を表します。Xは、場合運命状態であり、SG(X)= 0の場合のみ。
- すべてのxは(法的でなければなりません)1つのステップの状態に到達することができます行くためにSをしてみましょう。次に、$のSG(X)= MEX(SG(Y))(Y∈S)$があります
- 暴力チートのポイントを見つけることができ、主に法律を見つけるためにテーブルをヒット
三.SG定理
- SGとSG機能のゲームは、すべてのサブゲームXORとお互いのすべてのサブゲームの独立の関数です。
- したがって、上側の手は、排他的論理和の各パイル石のSG機能がゼロでない場合にのみ勝ちます。
例
対戦ゲームを取ります
分析
- SGはSGのA1 ^ ^ A2、A3 ^ ... ^ =。あなたはSGの==を紛失した場合は0提供、初期状態の定理によって決定されます
- あなたが勝った場合、A1」となるように、特定のa1は、削除されて想定しています。「^ A2 ^ A3 ^ ... ^ = 0 = SGがあります^ SG = SG ^ ^ A1、A2、A3 ^ ^ ... ^;
- したがって、SG ^ A1 = A 'とは、A1>なければなりません。';
- だから、SG ^ AI <AI、私は最初のスタックであるが除去されるとは愛 - SG ^がai。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
#include<cstring>
#include<algorithm>
#define lson x<<1
#define rson x<<1|1
#define ll long long
#define rint register int
#define mid ((L + R) >> 1)
using namespace std;
template <typename xxx> inline void read(xxx &x) {
char c = getchar(),f = 1;x = 0;
for(;c ^ '-' && !isdigit(c);c = getchar());
if(c == '-') c = getchar(),f = -1;
for(;isdigit(c);c = getchar()) x = (x<<1) + (x<<3) + (c ^ '0');
x *= f;
}
template<typename xxx>void print(xxx x)
{
if(x<0){putchar('-');x=-x;}
if(x>9) print(x/10);
putchar(x%10+'0');
}
const int maxn = 500010;
const int inf = 0x7fffffff;
const int mod = 1e9 + 7;
int SG;
int n,a[maxn];
int main()
{
read(n);
for(rint i = 1;i <= n; ++i) read(a[i]),SG ^= a[i];
if(!SG) {//当前即是必败态
printf("lose\n");
return 0;
}
for(rint i = 1;i <= n; ++i) {
if((SG ^ a[i]) < a[i]) {
printf("%d %d\n",a[i] - (SG ^ a[i]),i);
for(rint j = 1;j <= n; ++j) {
if(i ^ j) print(a[j]);
else print(a[i] ^ SG);
putchar(' ');
}
return 0;
}
}
return 0;
}