时间限制: 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; }