2020年浙江理工大学新生赛 B Cly的博弈

注意:本文的代码可以AC,但解释可能有误,思路仅供参考

Description
Cly很喜欢博弈,这天他和他的分身DD_BOND玩起了一个博弈游戏(本体当然是先手了),游戏规则如下,请你判断谁能赢得游戏。
最初有一个数字n,每次操作可以选择一个数字x满足0<x<n,且n%x==0,接着用n-x替换原本数字,谁不能操作谁就输了。
对于每次询问如果先手能赢,你需要告诉cly第一步能选择的最大x是什么,为了方便起见,你最后只需要告诉他所有询问x的和就行了。

Input
第一行查询数字q (1<=q<=1e5)
接下来q行每行输入一个数字n (1<=n<=1e5)

Output
对于每次查询如果先手胜,输出clynb,否则输出DD_BONDNB
最后输出一个和sum

Sample Input
【样例1输入】

1
1

【样例2输入】

1
2

Sample Output
【样例1输出】

DD_BONDNB
0

【样例2输出】

clynb
1

题目分析:
选择x∈(0,n),使n%x==0,然后n-=x,找不到这个x(不能操作)为输

假设n=1
第①步不能操作,先手输

假设n=2
①只能选择x=1n=2-1=1(到假设n=1
②不能操作,先手赢

假设n=3
①只能选择x=1n=3-1=2(到假设n=2
②只能选择x=1n=2-1=1
③不能操作,先手输

假设n=4
①如果选择x=1n=4-1=3(到假设n=3
②只能选择x=1n=3-1=2
③只能选择x=1n=2-1=1
④不能操作,先手赢

①如果选择x=2n=4-2=2(到假设n=2
②只能选择x=1n=2-1=1
③不能操作,先手输

可以再往下分析,得出结论:

如果先手可以使 n=1, 那么先手赢

奇数=1*奇数*······*奇数
偶数=1*(2^n)*(奇数 或 1)

n=n-x

所以

奇数只能变为偶数
偶数可以选择让它变为奇数

要使n=n-x=1n原来必然为偶数
所以

先手遇到偶数必赢,否则必输

所以

如果(输入的值为偶数),判负
否则,第一步可选的最大x为n的最大奇因数

代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
int main(){
	int q,n,sum=0;
	cin>>q;
	while(q--){
		scanf("%d",&n);//使用cin会TLE 
		if(n%2==1) cout<<"DD_BONDNB\n";
		else{
			cout<<"clynb\n";
			while(n%2==0)
				n/=2;//n除以2,直到n为奇数 
			sum+=n;
		}
	}
	cout<<sum;
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值