博弈论 7.25杭电多校赛 D

4.

Game

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1770 Accepted Submission(s): 1089

Problem Description

Alice and Bob are playing a game.The game is played on a set of positive integers from 1 to n.In one step, the player can choose a positive integer from the set, and erase all of its divisors from the set. If a divisor doesn't exist it will be ignored.Alice and Bob choose in turn, the one who cannot choose (current set is empty) loses.Alice goes first, she wanna know whether she can win. Please judge by outputing 'Yes' or 'No'.

Input

There might be multiple test cases, no more than 10. You need to read till the end of input.For each test case, a line containing an integer n. (1≤n≤500)

Output

A line for each test case, 'Yes' or 'No'.

Sample Input

1

Sample Output

Yes

题目大意:

​ 两个人玩游戏,有1-n,轮流取,取一个数的同时,会消掉它的因子。alice先手,给你n,判断她能不能赢

想法:

​ 不懂不懂,初看感觉是智商题。听他们说这是博弈论题,先手肯定赢,感觉很神奇。签到题。

思路:

​ 1、“1”是所有数的因子,取任意哪个数都会把1去掉。

​ 2、那么不考虑1的存在,从2-n去取。从2-n先手取数有必胜,必输两种情况。

​ 3、如果从2-n先手取数必胜,那alice先从2-n里取(1也没了)就胜了。如果从2-n先手取数必输,那alice先取1,那么bob就成了先手取2-n的了,aclice胜。

标准题解:

​ 考虑将游戏变成初始时只有2~n,如果先手必胜的话,那么先手第一步按这样取就获胜了;如果后手必胜的话,那 么先手第一步取走1就获胜了。所以全输出Yes就行了。

AC代码:

#include <iostream>
using namespace std;
​
int main() {
    int n;
    while(cin>>n) {
        cout<<"Yes"<<endl;
    } 
    return 0;
}
​

参考:

https://www.ideone.com/Wo55gi

猜你喜欢

转载自blog.csdn.net/KeeeepGO/article/details/81239809
今日推荐