SG機能の研究ノート

コンセプト

A.勝利状態と失う状態

  1. ウィン状態(N)、勝つこの状態に直面している下で、最適な戦略。
  2. この状態を失うことになる、最適な政策に直面している状態(P)を、失います。

二.SG機能

  1. MEX操作:最小要件は非負整数のセットに属していないと定義されます。
  2. SG(x)は、xは状態を表します。Xは、場合運命状態であり、SG(X)= 0の場合のみ。
  3. すべてのxは(法的でなければなりません)1つのステップの状態に到達することができます行くためにSをしてみましょう。次に、$のSG(X)= MEX(SG(Y))(Y∈S)$があります
  4. 暴力チートのポイントを見つけることができ、主に法律を見つけるためにテーブルをヒット

三.SG定理

  1. SGとSG機能のゲームは、すべてのサブゲームXORとお互いのすべてのサブゲームの独立の関数です。
  2. したがって、上側の手は、排他的論理和の各パイル石のSG機能がゼロでない場合にのみ勝ちます。

対戦ゲームを取ります

分析

  1. SGはSGのA1 ^ ^ A2、A3 ^ ... ^ =。あなたはSGの==を紛失した場合は0提供、初期状態の定理によって決定されます
  2. あなたが勝った場合、A1」となるように、特定のa1は、削除されて想定しています。「^ A2 ^ A3 ^ ... ^ = 0 = SGがあります^ SG = SG ^ ^ A1、A2、A3 ^ ^ ... ^;
  3. したがって、SG ^ A1 = A 'とは、A1>なければなりません。';
  4. だから、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;
}

おすすめ

転載: www.cnblogs.com/Thomastine/p/11798499.html