ZOJ2290

/*
第一个人,可以任意拿,但必须至少拿一个

这个题目不同于常规的游戏题目,首先石子的个数非常的巨大,不可能计算必胜态必败态。而且两个游戏着之间有某种操作上的联系,所以这个题目必须另外来找规律

首先根据规则石子个数是1的时候,必败。
通过枚举前100个石子的必胜必败态,可以搞清楚必败态的规律来。
其实必败态满足fibonaci数列。
也就是说石子数位1 2 3 5 8 13 21 34 ..这些石子的时候,不论怎么拿,都会失败
那么剩下的那些石子个数都是必胜态。
这个规律刚好能够满足题目所说的游戏规则。至于这个规律怎么来得暂时我也不是很清楚。

                                 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 
Fib                              1 1 1 0 1 0 0 1 0 0  0  0  1  0  0  0  0  0  0  0  1  0  0  0 
必胜态所能取的最小值                   1   1 2   1 2  3  1     1  2  3  1  5  1  2     1  2  3
必胜态所能取的最大值(理论上届)         1   1 2   2 3  3  3     4  4  5  5  5  6  6     7  7  7

按照必胜态的最小值选择初始值,就必然能够从必胜态转化为必败态
*/

#include <cstdio>
#include <cstdlib>

int fib[40];

void init()
{
	fib[0] = 1;
	fib[1] = 2;
	for(int i=2;i<40;i++)
	{
		fib[i] = fib[i-1]+fib[i-2];
	}
	
}

int main()
{
	init();
	
	int n;
	while(scanf("%d",&n)==1)
	{
		int cnt = 0,m = 0x7fffffff;
		for(int i=39;i>=0;i--)
		{
			if( n>=fib[i])
			{
				n-=fib[i];
				cnt++;
				if( fib[i]<m) m= fib[i];
			}

		}

		if(cnt==1) printf("lose\n");
		else
		{
			printf("%d\n",m);
		}
	}

	return 0;
}
posted @ 2011-06-14 20:35  AC2012  阅读(253)  评论(0编辑  收藏  举报