POJ-2975 Nim
阿新 • • 發佈:2018-12-11
題意: 給定一個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’
程式碼如下:
#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; }