题目描述
Alice和Bob玩取石子游戏。他们的游戏是这样的:总共有 n 个石头,每个人每次可以取 1 到 m 个石头,不能不取。最后取完的人获胜。现在Alice先取,假设双方都采取最好的策略,告诉你 n 和 m,问他是否能赢,如果能,第一次要取几个。
输入格式
只有一行,两个非负整数 n 和 m。
输出格式
第一行 Yes 或 No,表示Alice是否能赢。如果为 Yes,则有第二行,表示要取几个。
样例输入
100 8
样例输出
Yes
1
数据规模与约定
n,m是longint之内的数
一,题目简化
巴什博弈
二,题目分析
小学奥数题
因为对方取的石子是个不确定值,以至于我们无法判断结果。所以我们就要通过策略构造确定值。
先手取得石子数我们是可以控制的,所以把两个和在一起看—>我们可以设置一个值sum,表示双方取得石子每次加在一起都是sum,而我们要确定这个sum,使得无论对方取何值,我们都可以构造出sum
当对方取最小值1时,sum最小为2(1+1),最大为1+m
当对方取最大值m时,sum最小值为1+m,最大值为2m
可以把这个看做类似于不等式的东西,那么sum唯一可以取得是1+m
(图脑补吧)
所以sum唯一可取值是1+m,也就是两段的唯一交接处了
三,题目代码
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
long long n,m;
scanf("%lld%lld",&n,&m);
if(n%(m+1)==0) printf("No\n");
else printf("Yes\n%lld",n%(m+1));
return 0;
}