#NIM游戏#CodeChef A Game With a Sheet of Paper

SHGAME


分析

可以发现每次相当于去掉上下左右的若干行列,也就是 \(x-1,n-1-x,y-1,m-1-y\)

题目就转换成了取石子的问题,先手必胜当且仅当 \((x-1)\) xor \((n-1-x)\) xor \((y-1)\) xor \((m-1-y)=0\)

那么将行和列分别计算出 \((x-1)\) xor \((n-1-x)\) 减去相同的情况即可


代码

#include <cstdio>
#include <cctype>
using namespace std;
int n,m,c[1050011]; long long ans;
int iut(){
	int ans=0; char c=getchar();
	while (!isdigit(c)) c=getchar();
	while (isdigit(c)) ans=ans*10+c-48,c=getchar();
	return ans;
}
void print(long long ans){
	if (ans>9) print(ans/10);
	putchar(ans%10+48);
}
int main(){
	for (int T=iut();T;--T){
		n=iut(),m=iut(),ans=1ll*n*m;
		if (n>m) n^=m,m^=n,n^=m;
		for (int i=0;i<n;++i) ++c[i^(n-1-i)];
		for (int i=0;i<m;++i) ans-=c[i^(m-1-i)];
		for (int i=0;i<n;++i) --c[i^(n-1-i)];
		print(ans),putchar(10); 
	}
	return 0;
}
posted @ 2022-03-15 07:49  lemondinosaur  阅读(23)  评论(0编辑  收藏  举报