石子問題解題報告

2021-06-05 07:47:11 字數 1522 閱讀 9605

description

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

input

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

output

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

sample input

2 1

8 44 7

sample output

0

10

/*//下面的內容來自chengmingvictor
先找規律,算幾個很小的必敗狀態

1,23,5

4,76,10

8,13

...發現所有的數恰在序列中出現一次

而且差為1,2,3,4,5,...

所以這兩個序列構成正整數集的乙個分劃,猜想可以由betty定理生成(僅僅是猜想,不需要

太多的理由^_^)

其實,這兩個序列恰好對應betty定理中alpha=(1+sqrt(5))/2,beta=(3+sqrt(5))/2的情況,

所以問題解決。

這題不算出公式的話是沒法做的,因為規模太大,必敗狀態太多,沒有任何的辦法
betty定理是說,如果無理數alpha和beta滿足

1.alpha,beta>0

2.1/alpha+1/beta=1

那麼,序列和構成自然數集的乙個分劃,其中是取整函式

這道題對應的alpha和beta分別是(1+sqrt(5))/2,(3+sqrt(5))/2

所以alpha=1/**分割

beta/alpha=**分割

可以說跟**分割有關,但也只是一種巧合吧,**分割還是經常出現的*/

#include #include using namespace std;

int main()

{double alpha = (1.0 + sqrt(5.0)) / 2.0;

double beta = (3.0 + sqrt(5.0)) / 2.0;

int big, small, n, temp1, temp2;

while(cin>>big>>small)

{ if(big < small)

swap(big, small); //big 代表兩數中較大的乙個。

n = ceil(big / beta); //返回大於或者等於指定表示式的最小整數 標頭檔案:math.h

temp1 = alpha * n;

temp2 = beta * n;

if(small == temp1 && big == temp2)

cout<<0<

A 取石子遊戲(解題報告)

a 取石子遊戲 time limit 1000msmemory limit 10000kb64bit io format i64d i64u submit status description 有兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。遊戲規定,每次有兩種不同的取法,一是可以在任意...

取石子遊戲解題報告

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

取石子遊戲解題報告

有兩堆石子,兩個人輪流去取.每次取的時候,只能從較多的那堆石子裡取,並且取的數目必須是較少的那堆石子數目的整數倍.最後誰能夠把一堆石子取空誰就算贏.比如初始的時候兩堆石子的數目是25和7 25 7 11 7 4 7 4 3 1 3 1 0 選手1取 選手2取 選手1取 選手2取 選手1取 最後選手1...