ZZULIOJ--1253: 取石子游戏

时间限制: 1 Sec 内存限制: 128 MB
提交: 214 解决: 98
[状态] [提交] [命题人:admin]
题目描述
有两堆石子,数量任意,能够不一样。游戏开始由两我的轮流取石子。游戏规定,每次有两种不一样的取法,一是能够在任意的一堆中取走任意多的石子;二是能够在两堆中同时取走相同数量的石子。最后把石子所有取完者为胜者。如今给出初始的两堆石子的数目,若是轮到你先取,假设双方都采起最好的策略,问最后你是胜者仍是败者。ios

输入
输入包含若干行,表示若干种石子的初始状况,其中每一行包含两个非负整数a和b,表示两堆石子的数目,a和b都不大于1,000,000,000。web

输出
输出对应也有若干行,每行包含一个数字1或0,若是最后你是胜者,则为1,反之,则为0。svg

样例输入 Copy
2 1
8 4
4 7
样例输出 Copy
0
1
0
这道题看样例让我联想到了这会不会是一道水题,n+m只要是偶数是我赢,奇数就是对方赢,而后抱着试一试的态度,果真不对。
百度了一下以后发现了公式,简单点来讲,这是一道数学题,再一次的认识到敲代码的对数学能力的高要求
spa

#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <deque>
#include <map>
#include <set>
#include <stack>
#include <vector>
#include <string>
#include <cstring>
using namespace std;
int main()
{
	long long n,m;
	while(~scanf("%lld %lld",&n,&m)){
	if(n>m)
	swap(n,m);
	int temp=floor((m-n)*(1.0+sqrt(5.0))/2.0); //floor 意思为向下取整,意思和强定义int差很少 
	if(temp==n)
	printf("0\n");
	else
	printf("1\n");
	
	}
	
	return 0;
}