題面:
A 和 B 在玩取石子游戲,他們輪流操作,每次選擇其中一堆石子,取走一部分
有 n 堆石子,每堆一開始有 Ai 個
每堆石子在不同時刻能取的石頭個數是不一樣的
具體來說,當第 i 堆石子有 x 個的時候,最多在這堆石子中取走 個,
最少取走一個
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……
所以有遞推公式: ,注意到 在連續一段是一定的,因此可以類比整數分塊的思想。
代碼
#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;
}