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;
}
}
}
}
}