取石子遊戲HDU 2516(斐波那契博弈)

2021-10-10 02:38:37 字數 1030 閱讀 4307

題目傳送門

取石子遊戲

1堆石子有n個,兩人輪流取.先取者第1次可以取任意多個,但不能全部取完.以後每次取的石子數不能超過上次取子數的2倍。取完者勝.先取者負輸出"second win".先取者勝輸出"first win".

找規律會發現每乙個必敗點都是斐波那契數列中的值

#pragma gcc optimize("-ofast","-funroll-all-loops")

#include

#include

#include

#include

#include

using namespace std;

#define endl '\n'

#define inf 0x3f3f3f3f

// #define int long long

#define debug(a) cout<<#a<<"="long

long ll;

const

double pi=

acos(-

1.0)

;const

double e=

exp(

1.0)

;const

int m=

1e9+7;

const

int n=

2e5+7;

inline

intmymax

(int x,

int y)

inline

intmymin

(int x,

int y)

int f[59]

;void

init()

void

solve()

if(flag) cout<<

"first win"

"second win"

<}return;}

signed

main()

HDU 2516 取石子遊戲(斐波那契博弈)

本題是傳說中的斐波那契博弈,即 必敗點形成了fibonacci數列,通過找規律就可以看出來的 為何比賽時木有發現 problem description 1堆石子有n個,兩人輪流取.先取者第1次可以取任意多個,但不能全部取完.以後每次取的石子數不能超過上次取子數的2倍。取完者勝.先取者負輸出 sec...

HDU2516 取石子遊戲 斐波那契博弈

1堆石子有n個,兩人輪流取.先取者第1次可以取任意多個,但不能全部取完.以後每次取的石子數不能超過上次取子數的2倍。取完者勝.先取者負輸出 second win 先取者勝輸出 first win 輸入有多組.每組第1行是2 n 2 31.n 0退出.先取者負輸出 second win 先取者勝輸出 ...

HDU 2516 取石子遊戲(斐波那契博弈)

看這道題之前先看看什麼叫斐波那契博弈 斐波那契博弈 需要知道 zeckendorf定理 齊肯多夫定理 任何正整數可以表示為若干個不連續的fibonacci數之和。總結一下就是如果給定的數是斐波那契數列中的乙個,則先手必敗,否則先手必勝,沒有什麼道理的裸題 include include includ...