1. 程式人生 > >POJ 3533 Light Switching Game(三維Nim積)題解

POJ 3533 Light Switching Game(三維Nim積)題解

ostream span pan printf amp tdi clu ans cto

思路:三維Nim積

代碼:

#include<set>
#include<map>
#include<stack>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
typedef long long ll;
const int maxn = 1e6 + 10;
const int
seed = 131; const ll MOD = 1e9 + 7; const int INF = 0x3f3f3f3f; using namespace std; int m[2][2] = {0, 0, 0, 1}; int Nim_Mul_Power(int x, int y){ if(x < 2) return m[x][y]; int a = 0; for(; ; a++){ if(x >= (1 << (1 << a)) && x < (1 << (1 << (a + 1
)))) break; } int m = 1 << (1 << a); int p = x / m, s = y / m, t = y % m; int d1 = Nim_Mul_Power(p, s); int d2 = Nim_Mul_Power(p, t); return (m * (d1 ^ d2)) ^ Nim_Mul_Power(m / 2, d1); } int Nim_Mul(int x, int y){ if(x < y) return Nim_Mul(y, x);
if(x < 2) return m[x][y]; int a = 0; for(; ; a++){ if(x >= (1 << (1 << a)) && x < (1 << (1 << (a + 1)))) break; } int m = 1 << (1 << a); int p = x / m, q = x % m, s = y / m, t = y % m; int c1 = Nim_Mul(p, s), c2 = Nim_Mul(p, t) ^ Nim_Mul(q, s), c3 = Nim_Mul(q, t); return (m * (c1 ^ c2)) ^ c3 ^ Nim_Mul_Power(m / 2, c1); } int Nim_Multip(int x, int y, int z){ return Nim_Mul(Nim_Mul(x, y), z); } int main(){ int n, ans; while(~scanf("%d", &n)){ ans = 0; int x, y, z; while(n--){ scanf("%d%d%d", &x, &y, &z); ans ^= Nim_Multip(x, y, z); } if(ans) printf("No\n"); else printf("Yes\n"); } return 0; }

POJ 3533 Light Switching Game(三維Nim積)題解