1. 程式人生 > >POJ-2975 Nim

POJ-2975 Nim

題意: 給定一個Nim的N局面(先手必勝局面), 要求輸出可以通過幾種操作使得變為P局面(先手必敗局面)。 分析: 可知有命題:根據這個判斷被判為N-position的局面一定可以移動到某個P-position。 證明如下: 若對於某個局面(a1, a2, a3, … an)(此為N局面) 假設有(a1 ^ a2^ a3 … ^ai … ^an > 0), 那麼在一種合法的移動中可以將ai —> ai’, 使得 (a1 ^ a2 ^ a3 … ^ai’ … ^ an = 0)。 我們設 (a1 ^ a2 ^ a3 … ^ ai … an = k),則一定存在某個ai, 對於ai一定有ai對應的二進位制在k表示的二進位制最高位上一定為1(如此才能得到k), 所以 (ai ^ k < ai) 此為合法操作的前提。若轉化成P局面時, 那麼(ai’

= ai ^ k), 所以 (a1 ^ a2 ^ a3 … ^ai’ … ^ an ^ k = 0)。 綜上所述我們可以根據(ai ^ k < ai)這個條件進行判斷, 若滿足則可以進行轉化。統計結果。

程式碼如下:


#include <iostream>
using namespace std;

const int MAXN = 1e3 + 10;

int x[MAXN];
int main () {
    int n;
    while (cin >> n, n) {
        int status = 0;
        int cnt = 0;;

        for (int i = 0; i < n; i++) {
            cin >> x[i];
            status ^= x[i];
        }
        for (int i = 0; i < n; i++) {
            if ((status ^ x[i]) < x[i])
                cnt++;
        }
        cout << cnt << endl;
    }
    
    return 0;
}