POJ 2975 Nim

neweryyy發表於2020-11-06
題意

傳送門 POJ 2975

題解

N i m Nim Nim 遊戲的必敗態是 k 1 ⊕ k 2 ⋯ ⊕ k n = 0 k_1\oplus k_2\dots \oplus k_n=0 k1k2kn=0。假設當前為必勝態,有 k 1 ⊕ k 2 ⋯ ⊕ k n = x k_1\oplus k_2\dots \oplus k_n=x k1k2kn=x,那麼轉移的目標是使異或值為零。每一步只能從某一堆石子中取大於等於 1 1 1 的石子,假設取第 i i i 堆,那麼目標是使 k i ′ = k i ⊕ x k_{i}'=k_i\oplus x ki=kix,若 k i ′ < k k_i'<k ki<k 則存在取第 i i i 堆石子轉移至必敗態的方案。那麼列舉每一堆石子統計可行方案數即可。

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
#define maxn 1005
int N, K[maxn];

int main()
{
    while (~scanf("%d", &N) && N)
    {
        int x = 0;
        for (int i = 0; i < N; ++i)
        {
            scanf("%d", K + i);
            x ^= K[i];
        }
        int res = 0;
        for (int i = 0; i < N; ++i)
        {
            if ((K[i] ^ x) < K[i])
                ++res;
        }
        printf("%d\n", res);
    }
    return 0;
}