【CodeVS 1582】【SDOI 2009】E和D

http://codevs.cn/problem/1582/
首先我打了一张50*50的表(4用#代替)

并没有发现什么规律!

然后观察题解可得,我观察的是TimeMachine学长的题解
什么得到sg(i,j)=k的必要条件:
(i-1)%2k+1<2k
(j-1)%2k+1<2k
最小的k极为sg函数值。
然后log级别暴力找就可以了QAQ

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int in() {
	int k = 0, fh = 1; char c = getchar();
	for(; c < '0' || c > '9'; c = getchar())
		if (c == '-') fh = -1;
	for(; c >= '0' && c <= '9'; c = getchar())
		k = k * 10 + c - 48;
	return k * fh;
}

int n, a, b, ans;

int sg(int x, int y) {
	ll num = 2; --x; --y;
	for(int k = 0; ; ++k, num <<= 1)
		if (x % num < num / 2 && y % num < num / 2)
			return k;
}

int main() {
	int T; T = in();
	while (T--) {
		n = in(); ans = 0;
		while (n) {
			n -= 2;
			a = in(); b = in();
			ans ^= sg(a, b);
		}
		puts(ans ? "YES" : "NO");
	}
	return 0;
}
原文地址:https://www.cnblogs.com/abclzr/p/5935049.html