栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Being a Good Boy in Spring Festival(nim博弈的取胜方式数)一些超详细的推导

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Being a Good Boy in Spring Festival(nim博弈的取胜方式数)一些超详细的推导

m堆牌,每次只能选择一堆牌抽取任意张(所以sg(n)=n)。

用s储存所有sg函数的异或值。根据题意可以知道是如果选择a【i】(第i堆,牌数为a【i】)最多可以抽a[i]张(废话),怎么样可以取胜呢——令抽取了x张牌后的nim和等于0。也就是说,s^a[i]^(a[i]-x)==0; (s^a[i]等于除了a[i]之外所以数的异或值)又因为一个数和它本身求异或值的话也就等于0,所以可以得出s^a[i]==a[i]-x (抽任意张牌,x肯定大于0),又因为x到底是几我们不确定,但是肯定大于零,所以可以把判断条件写为(a[i]>(s^a[i])),又因为运算符的优先级,所以要加括号。然后就是计数p++

#include
#include
using namespace std;
int  m, p,s; 
int a[101];

int main() {
	while (cin >> m) {
		if ( m == 0)break;
		s = 0;
		for(int i = 1; i <= m;i++) {
			cin >>a[i];
			s = s^a[i];//异或的和
		}
		for (int i = 1; i <= m; i++) {
			if (a[i] > (s ^ a[i]))p++;
		}
		if (s==0)cout << 0<< endl;
		else cout <

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/743435.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号