思路:被分成两个相同的组的状态是必败态
作出对称的状态后再模仿对手
如果个数不大于2,Alice能一次拿完,否则Alice每拿一次,Bob能通过取走一枚或两枚硬币将其分成两个长度相同的链,则留给Alice的是必败态。
#include<iostream>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
if(!n) break;
if(n<=2) cout<<"Alice"<<endl;
else cout<<"Bob"<<endl;
}
return 0;
}
https://www.luogu.org/blog/zyy/solution-p1290 这个题解很好的鸭
#include<iostream>
#include<algorithm>
using namespace std;
int a,b;
void solve()
{
bool f=true; //f为先手是否必胜
for(;;)
{
if(a>b) swap(a,b);
if(b%a==0) break; //出现了一个必胜态
if(b>2*a) break; //另一个必胜态
b-=a;
f=!f;
}
if(f) cout<<"Stan wins"<<endl;
else cout<<"Ollie wins"<<endl;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;++i)
{
cin>>a>>b;
solve();
}
return 0;
}