4005 取石子游戏
巴什博弈: 取石子儿,石子儿一共n个,如果只能取1-m个,两个人轮流取。
(m+1)|n 先手取x个,后手就可以取(m+1-x)个。最后一定是后手全部取完。
若不能整除n的话。若先手先把余数全部取完,先手就变成了第一种情况中的后手。先手必胜。
必胜态:可以走到对手必败的状态
必败态:0
分类讨论:
(1) m <n :巴什博奕直接出结果
(2)若如果m>n的话
1) m%3!=0 n%3==0 无论先手怎么出,后手都能让剩余的n%3=0,。最后拉扯到m<n.
某次后手操作之后,n变成了可以整除的形式,且由于n<m, 只能取1,2,后手必胜。,
2)m%3!=0 n%3!=0 ,先手可以把余数给取走。先手必胜。
3)m%3==0 结果每(m+1)一个循环,可以先取余 n%(m+1)。剩下k个,先手必胜。
剩下<k个,巴什博奕可判。
一个点WA
#include<bits/stdc++.h>
using namespace std;
int n,m,t;int bashboyi(int n,int m)
{return (n%(m+1))!=0;
}
int main()
{cin>>t;while(t--){cin>>n>>m;if(m<=n){if(bashboyi(n,m)){cout<<"Alice"<<endl;}else{cout<<"Bob"<<endl;}}else if(m>n){if(m%3&&n%3==0)cout<<"Bob"<<endl;else if(m%3&&n%3){cout<<"Alice"<<endl;}else if(m%3==0){//cout<<"进入分支"<<endl;n%=(m+1);if(n==m) cout<<"Alice"<<endl;else if(bashboyi(n,m)){cout<<"Alice"<<endl;}else{cout<<"Bob"<<endl;}}}}}