列表

详情


NC19787. Stones

描述

有n堆石子,第i堆石子有xi个。
修修和栋栋轮流取石子,每人每次需要从任意一堆石子中取走个,修修先手。无法操作的人失败。此外,如果一个人取完了一堆石子,他会立即获胜。
不巧的是,修修除了数数以外啥都不会,他希望你帮他求出他能否获胜。

输入描述

第一行一个整数t表示数据组数 (1 ≤ t ≤ 1000)。
每组数据第一行三个整数n,a,b (1 ≤ n ≤ 1000,1≤ a ≤ b ≤ 109),第二行n个整数 (1 ≤ xi ≤ 109)。

输出描述

每组数据输出一行一个字符串:如果修修可以获胜输出Yes,否则输出No。

示例1

输入:

2
1 1 3
4
1 1 3
6

输出:

No
Yes

原站题解

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

C++14(g++5.4) 解法, 执行用时: 151ms, 内存消耗: 352K, 提交时间: 2018-10-10 19:21:23

#include <bits/stdc++.h>
using namespace std;

int a, b;
int SG(int s)
{
    if (s <= b) return 0;
    if (a == 1) return s % (a+b);
    s -= b;
    s %= (a+b);
    s /= a;
    if (s <= 1) s ^= 1;
    return s;
}
int main()
{   
    int T, n;
    cin >> T;
    while (T--) {
        int s;
        int ans = 0;
        int tmp = 0;
        scanf("%d %d %d", &n, &a, &b);
        for (int i = 1; i <= n; ++i) {
            scanf("%d", &s);
            if (s >= a && s <= b)   tmp = 1;
            ans ^= SG(s);
        }
        if (tmp == 1 || ans)    cout << "Yes" << '\n';
        else    cout << "No" << '\n';
    }
    return 0;
}

C++(clang++11) 解法, 执行用时: 380ms, 内存消耗: 360K, 提交时间: 2020-12-16 19:50:43

#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
using namespace std;
#define ll long long  
ll n,a,b,s,x;
bool f;
 
 
ll sg(ll x){
    x%=b+a;
    if(a==1)return x;
    if(x<a)return 0;
    if(x>=b)return 1;
    return x/a+1;
}
 
int main(){
    int t;
	cin>>t;
	while(t--){
	f=false;s=0;
     cin>>n>>a>>b;
	for(int i=0;i<n;i++){
	    cin>>x;
	    if(a<=x&&x<=b)f=true;
	    s^=sg(x);
	}
	puts(f||s?"Yes":"No");
    }
    return 0;
}

上一题