题目大意:给$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; }