列表

详情


NC236919. Stone Game

描述

n 个箱子,第i个箱子最多放 s_i个石子,当前箱子里的石子数为 c_i。两个人轮流往箱子里放石子,而且每一次放的数量都有限制:不能超过当前箱子内石子数的平方。例如箱子里有 3 颗石子,那么下一个人就可以放1-9 颗石子,直到箱子被装满。当有一方放不下石子时游戏结束,最后放不下石子的人输。问先手是否能获胜。

输入描述

第一行一个整数 n (),表示箱子个数。

接下来 n 行,每行两个整数 s_i, c_i (),表示第 i 个箱子最多放 s_i 个石子,以及当前箱子中已经有 c_i 个石子。

输出描述

如果先手获胜输出"Yes",否则输出"No"。

示例1

输入:

3
2 0
3 3
6 2

输出:

Yes

示例2

输入:

2
6 3
6 3

输出:

No

原站题解

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

pypy3 解法, 执行用时: 72ms, 内存消耗: 21212K, 提交时间: 2023-07-19 14:33:27

import sys;input=sys.stdin.readline;R=lambda:list(map(int,input().split()));P=lambda x:print(x);I=lambda:int(input());YES='Yes';NO='No'
a=[]
for _ in range(I()):
    x,y=R()
    if not y:
        a.append(0)
        continue
    s=x
    c=y
    while 1:
        q=int(s**0.5)
        while q*q+q>=s:
            q-=1
        if q<c:
            a.append(s-c)
            break
        if q==c:
            a.append(0)
        s=q
r=0
for i in a:
    r^=i
if r:
    P(YES)
else:
    P(NO)

C++(g++ 7.5.0) 解法, 执行用时: 5ms, 内存消耗: 476K, 提交时间: 2022-11-04 15:04:34

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

int n;

int get_sg(int x,int y)
{
    int q=sqrt(x);
    while(q+q*q>=x) q--;
    if(q>=y) return get_sg(q,y);
    else return x-y;
}

int main()
{
    scanf("%d",&n);
    long long ans=0;
    for(int i=1;i<=n;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        ans^=get_sg(x,y);
    }
    if(ans) printf("Yes\n");
    else printf("No\n");
}

C++(clang++ 11.0.1) 解法, 执行用时: 4ms, 内存消耗: 428K, 提交时间: 2023-07-22 11:17:08

#include<bits/stdc++.h>
using namespace std;
int sg(int x,int y){
	int q=sqrt(x);
	while(q*(q+1)>=x)q--;
	if(q>=y)return sg(q,y);
	else return x-y;
}
signed main(){
    int n,m,k,ans=0;
    scanf("%d",&n);
    while(n--){
        scanf("%d%d",&m,&k);
        ans^=sg(m,k);
    }if(ans)cout<<"Yes\n";
    else cout<<"No\n";
}

上一题