1. 程式人生 > > 161-取石子 (四)

161-取石子 (四)

題目描述:

有兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。遊戲規定,每次有兩種不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在兩堆中同時取走相同數量的石子。最後把石子全部取完者為勝者。現在給出初始的兩堆石子的數目,如果輪到你先取,假設雙方都採取最好的策略,問最後你是勝者還是敗者。

輸入描述:

輸入包含若干行,表示若干種石子的初始情況,其中每一行包含兩個非負整數a和b,表示兩堆石子的數目,a和b都不大於1,000,000,000。

輸出描述:

輸出對應也有若干行,每行包含一個數字1或0,如果最後你是勝者,則為1,反之,則為0。

樣例輸入:

2 1
8 4
4 7

樣例輸出:

0
1
0

這是原原本本的威佐夫博弈,出現以下情況一定會輸:

0.      (0, 0)       0*((1+sqrt(5))/2)取整==0 , 0+0==0

1.      (1, 2)       1*((1+sqrt(5))/2)取整==1, 1+1==2

2.      (3, 5)       2*((1+sqrt(5))/2)取整==3, 2+3==5

3.      (4, 7)       3*((1+sqrt(5))/2)取整==4, 3+4==7

4.      (6, 10)       4*((1+sqrt(5))/2)取整==6, 4+6==10

5.      (8, 13)       5*((1+sqrt(5))/2)取整==8, 5+8==13

......


#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,m;
    while(cin>>n>>m)
    {
        if(n>m)
            swap(n,m);
        int a=floor((m-n)*(sqrt(5.0)+1)/2);
        if(a==n)
            cout<<"0"<<endl;
        else
            cout<<"1"<<endl;
    }
    return 0;
}