【ARC090 F】Strange Nim(SG函數)

題面:
A 和 B 在玩取石子游戲,他們輪流操作,每次選擇其中一堆石子,取走一部分
有 n 堆石子,每堆一開始有 Ai 個
每堆石子在不同時刻能取的石頭個數是不一樣的
具體來說,當第 i 堆石子有 x 個的時候,最多在這堆石子中取走 xKi 個,
最少取走一個
1<=n<=200
1 <= Ai, Ki <= 1e9

題解:
寫寫畫畫發現K=4時,SG函數如下:
0 0 0 0
1 0 1 0
2 1 0 2
3 1 0 2
……
規律大概是去掉第一行後,從左到右,從上到下的序列都是一樣的:
0 0 0 0 1 0 1 0 2 1 0 2……
所以有遞推公式:f(x,y)=f(x(xy+1),y) ,注意到xKi 在連續一段是一定的,因此可以類比整數分塊的思想。

代碼

#include <bits/stdc++.h>
using namespace std;

int solve(int x,int y)
{
    if (x%y==0) return x/y;
    int k=x/y+1;
    return solve(x-max(1,x%y/k)*k,y);
}
int n,x,y,ans;
int main()
{
    scanf("%d",&n);
    while (n--)
    {
        scanf("%d%d",&x,&y),ans^=solve(x,y);
    }
    return printf("%s",ans?"Takahashi":"Aoki"),0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章