天天看点

ural 1180. Stone Game (博弈)

#include <iostream>
using namespace std;

int main()
{
	int i, j, h;
	char n[300];
	cin>>n;
	h = strlen(n);
	j = 0;
	for (i=0; i<h; i++)
		j = (j * 10 + (n[i] - '0')) % 3;
	if (j == 0)
		cout<<2<<endl;
	else
		cout<<1<<endl<<j<<endl;
}
           

首先写出前几个局面: 必胜:1,2,4,5,7,8,10,11... 必败:3,6,9,12,15... 猜想:n = 3*k时必败 证明: k = 1时成立. 假设k = m时成立; 当k = m+1时,n =3*k+3 由于所取石子数必须时2的指数,所以n不可能导向一个3的倍数的局面,也就是n取出一定石子必定是必胜局面,所以n是必败局面,证毕. 注意:n的范围很大,要用大数取模,用字符串读入.