列表

详情


NC221662. 博弈

描述

牛牛和牛妹在玩一个游戏。

他们的游戏是这样的:现在有n堆石子,第i堆有a_i个,牛牛和牛妹轮流操作,牛牛先操作,每次有两种操作方案:

1.选取任意一堆取走任意多个石子(取走的石子数小于等于那一堆现存数量);

2.将一堆石子分成k份,要求这k份石子每份的数量都不等于0;

为了遵循女士优先的原则,牛妹先手,当某方无法操作时那一方就算输。请问牛妹有没有必胜的策略?本题有T组测试数据。









输入描述

第一行输入T。
对于每一组数据,一共两行。
第一行两个数n、k分别表示有n组石头,k个数。
第二行n个数a_1,a_2,a_3...a_n表示第i堆石子有a_i个石子。

输出描述

对于每一组数据,如果牛妹有必胜方案,输出"yes"否则输出"no",均不含引号,用空格隔开。

示例1

输入:

2
5 2
1 2 3 4 5
4 3
1 2 4 8

输出:

yes
no

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 417ms, 内存消耗: 472K, 提交时间: 2021-05-25 17:37:38

#include <stdio.h>

void solve(){
	int n,k,ans=0;
	scanf("%d%d",&n,&k);
	int mask = (1<<k)-1;
	for(int i=0;i<n;i++){
		int a;
		scanf("%d",&a);
		if((a&mask)==mask)
			ans ^= (a+1);
		else if((a&mask)==0)
			ans ^= (a-1);
		else
			ans ^= a;
	}
	puts(ans?"yes":"no");
}

int main(){
	int T; scanf("%d",&T);
	while(T--) solve();
}

上一题