可以一次从两堆石头里取相同多,也可以只在一堆里取任意多。最快捷的方法是用通项公式,对于我来说,需要把通项公式背下来
a=(1+sqrt(5))/2;
b=(3+sqrt(5))/2;
int i=n;
while(i>1)
{
if( floor(a*i)==n&&floor(b*i)==m )
return false;
i–;
}
return true;
以上是需要记住的判断的通项公式;
代码如下:
#include<iostream>
#include<math.h>
using namespace std;
bool nim(int n,int m)
{
double a,b;
int temp;
a=(1+sqrt(5.0))/2;
b=(3+sqrt(5.0))/2;
cout<<“a”<<a<<endl;
if(m==n)
return true;
if(n>m)//swap
{
temp=n;
n=m;
m=temp;
}
int i=n;
while(i>=1)
{
if((int)floor(a*i)==n&&floor(b*i)==m)//向下取整
return false;
i–;
}
return true;
}
int main()
{
int m,n;
cin>>n>>m;
if(nim(n,m))cout<<“YES”<<endl;
else cout<<“NO”<<endl;
return 0;
}