小A取石子 (nim博弈)

链接:https://ac.nowcoder.com/acm/contest/549/I

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;

int main(){
	int n,k,a[100005],s,num;
	cin>>n>>k;
	s = 0;
	for(int i = 0;i<n;++i){
		scanf("%d",&a[i]);
		s ^= a[i];
	}
	if(s != 0) cout<<"YES\n";
	else{
		num = 0;
		for(int i = 0;i<n;++i){
			if(a[i] < k) continue;    //必须正好取k个 
			s = num^a[i];    //这里用到a^a = 0这个性质 
			s ^= (a[i]-k);
			if(s != 0){
				cout<<"YES\n";
				return 0;
			}
		}
		cout<<"NO\n";
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/dukig/article/details/89279186