天天看點

牛牛愛博弈

題目連結

題意:一堆石子,有n個,每次可以取2k個,取走最後一個的勝利,先手:Alan,後手:Frame

感覺自己的眼瞎病的治治了,第一遍看題目時看成是n堆,我想可能又要用SG啥的,就先放棄了,然後一道我看上去很簡單但我做不出來的題卡了,然後又回來做這題,然後拼命回想SG函數,然後看下樣例隻有一堆石子,瞬間就懵了233.

好了,牢騷發完了,正式進入本題解法(簽到題),我們就一個一個推吧。

n=1 先手拿一個,先手勝利

n=2 先手拿兩個,先手勝利

n=3 先手拿走1或2,剩下的後手都可一次拿完,後手勝利

n=4 先手拿走1個,剩下3個,後手充當n=3時的先手,先手勝利

n=5 先手拿走2個,剩下3個,後手充當n=3時的先手,先手勝利

n=6 先手拿完後剩下的n所有可能為5,4,2,結合上面的規律,後手勝利

不難發現,n=3是一個關鍵,也就是說誰輪到了n=3的情況則必敗,然而取一次不能取到3的倍數,而取兩次則必定可以取到3的倍數,也就是說當n為3的倍數時先手必定會陷入是n=3時先取的情況,然後後手勝,當n不是3的倍數時,先手隻要保證通過取走1個或2個石子,就可以使後手充當n為3的倍數時的先手。

#include<iostream>

using namespace std;

int main(){
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        if(n%3==0) cout<<"Frame"<<endl;
        else cout<<"Alan"<<endl;
    }
}