您的位置:首页 > 其它

51nod1714(简单的博弈,SG函数)

2016-08-01 21:38 162 查看
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1714

上51nod突然发现很久以前有个题没有过,发现是博弈,要求SG函数,但是抓耳挠腮也没想出来怎么在时限里求,于是看了看解题报告,说是用一种不算暴力的暴力,还是不懂,还去问了q巨(q巨对我说直接暴力,跑的飞快),我跑了一下,几秒钟没跑出来就又怯生生地去问q巨,q巨说一分钟不到就可以跑出来了啊(晕,这算不算暴力的暴力吗,可能是我眼界窄吧),于是怒暴力打表,问题迎刃而解。

//
//  main.cpp
//  1714
//
//  Created by 黄宇凡 on 8/1/16.
//  Copyright © 2016 黄宇凡. All rights reserved.
//

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

long long sg[65] = {0,
1,
2,
4,
8,
16,
32,
64,
128,
255,
256,
512,
1024,
2048,
3855,
4096,
8192,
13107,
16384,
21845,
27306,
32768,
38506,
65536,
71576,
92115,
101470,
131072,
138406,
172589,
240014,
262144,
272069,
380556,
524288,
536169,
679601,
847140,
1048576,
1072054,
1258879,
1397519,
2005450,
2097152,
2121415,
2496892,
2738813,
3993667,
4194304,
4241896,
4617503,
5821704,
7559873,
8388608,
8439273,
8861366,
11119275,
11973252,
13280789,
16777216,
16844349,
17102035,
19984054,
21979742,
23734709
};
//int vis[100000000];

//void init(){
//    sg[0] = 0;
//    for(int i = 1;i <= 64;i++){
//        for(int j1 = 0;j1 < i;j1++){
//            for(int j2 = j1;j2 < i;j2++){
//                for(int j3 = j2;j3 < i;j3++){
//                    for(int j4 = j3;j4 < i;j4++){
//                        for(int j5 = j4;j5 < i;j5++){
//                            for(int j6 = j5;j6 < i;j6++){
//                                for(int j7 = j6;j7 < i;j7++){
//                                    long long tmp = sg[j1] ^ sg[j2] ^ sg[j3] ^ sg[j4] ^ sg[j5] ^ sg[j6] ^ sg[j7];
//                                    vis[tmp] = i;
//                                }
//                            }
//                        }
//                    }
//                }
//            }
//        }
//        for(int j = 0;j < 30000000;j++){
//            if(vis[j] != i) {sg[i] = j;break;}
//        }
//    }
//}

int main(int argc, const char * argv[]) {
//init();
//    for(int i = 0;i <= 64;i++){
//        cout << sg[i] << endl;
//    }
int n;
cin >> n;
unsigned long long x;
long long ans = 0;
for(int i = 1;i <= n;i++){
cin >> x;
int sum = 0;
while(x > 0){
if(x & 1) sum++;
x >>= 1;
}
ans ^= sg[sum];
}
if(ans == 0) printf("L\n");
else printf("B\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  51nod