[UOJ #51]【UR #4】元旦三侠的游戏

题目大意:给$n$,一个游戏,给$a,b$,两个人,每人每次可以把$a$或$b$加一,要求$a^bleqslant n$,无法操作人输。有$m$次询问,每次给你$a,b$,问先手可否必胜

题解:令$f_{i,j}$表示$a=i,b=j$使得胜负,$f_{i,j}$可由$f_{i+1,j},f_{i,j+1}$推出,但这样会$MLE(b=1)$,发现若$a>sqrt n$,可以直接奇偶性判断。

卡点:原来写的东西不知道为什么锅,换成题解的方式就过了

C++ Code:

#include <cstdio>
#define maxn 32010
const int sq = 32000;
int n, m;
int exp[maxn];
bool f[maxn][31];
int main() {
	scanf("%d%d", &n, &m);
	exp[1] = n;
	for (int i = 2; i <= sq; i++) {
		if (i > n) exp[i] = 0;
		else {
			long long S = i, j;
			for (j = 2; (S *= i) <= n; j++) ;
			exp[i] = j - 1;
		}
	}
	f[sq + 1][1] = !(n - sq - 1 & 1);
	for (int i = sq; i > 1; i--) {
		for (int j = exp[i]; j; j--) {
			f[i][j] = !(f[i][j + 1] || f[i + 1][j]);
		}
	}
	while (m --> 0) {
		int a, b;
		scanf("%d%d", &a, &b);
		if (a > sq) puts((n - a & 1) ? "Yes" : "No");
		else puts(f[a][b] ? "No" : "Yes");
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/Memory-of-winter/p/9801812.html