列表

详情


NC201621. 取石子游戏

描述

 小灰灰和小乔在玩取石子游戏,一堆石子有个石子,小灰灰和小乔轮流操作,小灰灰先手,每次操作的人可以进行以下操作:

       假设当前石子数量为,如果,那么将石子分为两堆,然后选择其中任意一堆石子取走。否则当前操作的人输。
       其中为满足满足的最大整数。

       小灰灰和小乔都非常聪明,所以都会采用最优的策略,你知道最后小灰灰和小乔谁能赢得游戏吗?

输入描述

输入共包含组数据

第一行一个整数,表示测试用例的组数

接下来行每行一个整数

输出描述

对于每组案例,如果小灰灰赢,输出,否则输出,不带双引号。

示例1

输入:

10
1
2
3
4
5
6
7
8
9
10

输出:

XiaoQiao
XiaoHuiHui
XiaoHuiHui
XiaoQiao
XiaoQiao
XiaoQiao
XiaoHuiHui
XiaoHuiHui
XiaoHuiHui
XiaoHuiHui

原站题解

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

C++14(g++5.4) 解法, 执行用时: 29ms, 内存消耗: 1496K, 提交时间: 2020-03-13 20:32:26

#include<iostream>
using namespace std;
int main()
{
	int x;
	scanf("%d",&x);
	for(long long a;x--;)
	{
		scanf("%lld",&a);
		long long sum=1;
		int i=0;
		for(;sum<a;i++)
		{
			sum*=2;
			if(i%2==0)sum++;
		}
		printf(i%2?"XiaoHuiHui\n":"XiaoQiao\n");
	}
	return 0;
}

C(clang11) 解法, 执行用时: 26ms, 内存消耗: 1272K, 提交时间: 2021-04-27 13:34:03

#include<stdio.h>
int main()
{
	long long i,j,k,l,n,t;
	scanf("%lld",&t);
	while(t--){
		scanf("%lld",&n);
		for(k=1,l=2;k<n;){
			if(l==2){
				l=1;k=k*2+1;
			}
			else{
				l=2;k*=2;
			}
		}
		if(l==1)
		printf("XiaoHuiHui\n");
		else
		printf("XiaoQiao\n");
	}
}

C++11(clang++ 3.9) 解法, 执行用时: 198ms, 内存消耗: 1272K, 提交时间: 2020-03-13 19:19:32

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5+5;

int T,f[N];
ll n;

int main(){
	cin>>T;
	while(T--){
		cin>>n;
		ll x=3;
		while(n>x)x=x*4+1;
		if(n>x/2)puts("XiaoHuiHui");
		else puts("XiaoQiao");
	}
}

pypy3(pypy3.6.1) 解法, 执行用时: 521ms, 内存消耗: 25824K, 提交时间: 2020-03-13 22:49:52

ans = ['XiaoQiao', 'XiaoHuiHui']
for _ in range(int(input())):
    n = int(input())
    b = 1
    f = 0
    while n > b:
        f ^= 1
        b = (b << 1) + f
    print(ans[f])

上一题