题目描述
有 1 堆石子,总个数是 n ,两名玩家轮流在石子堆中拿石子,每次至少取 1 个,至多取 m 个。取走最后一个石子的玩家为胜者。判定先手和后手谁胜。
结论: n%(m+1)=0时,先手必败;否则先手必胜。
证明:
①当m>=n时,显然先手必胜。
②当m+1=n时,无论先手取多少个,后手都能一次全部取完,先手必败。
③当n%(m+1)=0时,假设先手取了x个,那么后手一定可以取(m+1)-x个。因此无论先手怎么取,聪明的后手都会使得最后的物品总数量是m+1的倍数,慢慢的就会到②的情况,因此先手必败。
④当n%(m+1)!=0时,先手就可以先取n%(m+1)个物品,这样就会丢下n%(m+1)=0的局面给对面,那么后手必败,先手必胜。
分析:这题可以自己多试几个数据,然后就可以得出上方的这个结论,也可以利用逻辑性推理来实现。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m;cin>>n>>m;
if(n%(m+1)==0)cout<<"先手必败"<<endl;
else cout<<"先手必胜"<<endl;
}