第二期第四题

问题:有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。

source:NOI

分析:最后一个奇异局势是(0,0)。紧接着的奇异局势有(1,2),(3,5),(4,7),(6,10)…
现在把它们看成一个奇异局势组成的序列(0,0),(1,2),(3,5),(4,7),(6,10)…
奇异局势的判定:
] 我们会发现这个序列的规律,设序列第k个奇异局势元素为(Ak,Bk),k为自然数。那么,初始条件k=0时是,A0=B0=0,递推关系为下一个奇异局势的Ak是未在前面出现过的最小自然数,且Ak= Bk + k。
奇异局势的第一位数刚好就是黄金分割率的倍数的取整的子集。


#include "stdafx.h"
#include<iostream>
using namespace std;
#include<cmath>
const double m=(1+sqrt(5.0))/2;
int _tmain(int argc, _TCHAR* argv[])
{
	int a,b;
	while(cin>>a>>b)
	{
		int swap;
		if(a>b)
		{
			swap=a;
			a=b;
			b=swap;
		}
	  int j=a/m;
	  if(a==b)
	  {
		  cout<<"1"<<endl;
		  continue ;
	  }
	  if(a==(int)(j*m )&&b==j+a)
		 cout<<"0"<<endl;
	  else
			 
	  {
		  if(a==(int)((j+1)*m)&&b==a+j+1)
		  cout<<"0"<<endl;
	  
	  else
		   cout<<"1"<<endl;
	  }
	}
		   
	return 0;
}


猜你喜欢

转载自blog.csdn.net/weixin_43792166/article/details/84977972