列表

详情


NC14619. 栗酱的异或和

描述

        栗酱特别喜欢玩石子游戏,就是两个人玩,有n堆石子,每堆有ai个,每次一个人可以轮流选择任意一堆,取走任意多的石子(但不能不取),谁先不能取谁输。
        栗酱觉得这个游戏很有趣,知道有一天,小太阳告诉她,其实如果两个人足够聪明,游戏的结局一开始就已经注定。
        栗酱是一个冰雪聪明的女孩子,她不相信,希望你演示给她看。

输入描述

多组数据,数据第一行T表示数据组数。
每组数据第一行一个n,k表示一共有n堆石子,接下来你试图从第k堆开始取,从第二行开始,每隔一个空格一个第i堆石子的数量ai。
n≤105,  ai≤109

输出描述

输出“Yes”或“No”代表从该堆开始取是否可以必胜(如果足够聪明)。

示例1

输入:

2
3 2
1 2 3
2 1
2 1

输出:

No
Yes

说明:

小太阳哥哥说,如果想赢,就试图把每堆石子数量的异或和变为0,最终便可以获得胜利,不相信自己证一下。

原站题解

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

C++(g++ 7.5.0) 解法, 执行用时: 14ms, 内存消耗: 284K, 提交时间: 2023-07-27 19:13:02

#include<cstdio>
int T,n,K,m,tot;
int main()
{
	for(scanf("%d",&T);T;T--)
	{
		tot=0;
		scanf("%d%d",&n,&K);
		for(int i=1,x;i<=n;i++)
		{
			scanf("%d",&x);
			if(i==K) m=x;
			else tot^=x;
		}
		printf(tot<m?"Yes\n":"No\n");
	}
}

pypy3 解法, 执行用时: 157ms, 内存消耗: 35560K, 提交时间: 2023-02-20 19:46:55

for _ in range(int(input())):
    n,k = map(int,input().split())
    l=list(map(int,input().split()))
    c=0
    for i in l:
        c^= i
    if l[k-1]>l[k-1]^c:
        print("Yes")
    else:
        print("No")

Python3 解法, 执行用时: 67ms, 内存消耗: 15904K, 提交时间: 2022-01-14 11:30:15

for _ in range(int(input())):
    n,m=input().split()
    m=int(m)
    sum=0
    p=list(map(int,input().strip().split()))
    for i in p:
        sum^=i
    print("Yes"if p[m-1]>(p[m-1]^sum) else "No")

上一题