http://acm.hdu.edu.cn/showproblem.php?pid=2177
分析思路见注释:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
long long a,b,i;
double t=(sqrt(5)+1)*1.0/2.0;
while(cin>>a>>b)
{
if(a==0&&b==0) break;
if(a>b)
{
a=a+b;
b=a-b;
a=a-b;
}
long long k=b-a;
if(a==(int)(t*k))
cout<<"0"<<endl;
else
{
cout<<"1"<<endl;
long long a_,b_;
for(i=1;i<=a;i++) //在两堆中拿走相同个数的石子,判断是否满足必败态
{
a_=a-i;
b_=b-i;
if(a_==(int)(t*k))
{
cout<<a_<<" "<<b_<<endl;
break;
}
}
for(i=1;i<=a;i++) //只在a堆中拿石子
{
a_=a-i;
b_=b;
if(a_==(int)(t*(k+i)))
{
cout<<a_<<" "<<b_<<endl;
break;
}
}
if(a!=b) //a==b时与前面的a递减得到的结果会重复,如5,5前面已得到3,5,后面不需重复考虑
{
for(i=1;i<=b;i++)
{
a_=a;
b_=b-i;
if(a_==(int)(t*(k-i))) //a_仍然<b_时
{
cout<<a_<<" "<<b_<<endl;
break;
}
else if(b_==(int)(t*(i-k))) //b_递减当b_<a_时
{
cout<<b_<<" "<<a_<<endl;
break;
}
}
}
}
}
return 0;
}