【AtCoder Regular Contest 091 F】Strange Nim

博弈论,找规律。

题目大意:

有 $n$ 堆石子,第 $i$ 堆有 $A_i$ 个石子,并且有系数 $K_i$。

每次可以从一堆石子中取 $x$ 个,必须满足 $1\leq x\leq \lfloor\frac{A_i}{K_i}\rfloor$。不能取者输。

问是否先手必胜。

题解:

打表找 SG 函数的规律。

可以得到:

然后整除分块计算即可。

时间复杂度 $O(\sum\sqrt {A_i})$。

证明不会

Code:

#include<cstdio>
int n,g,A,K;
int main(){
    for(scanf("%d",&n);n--;g^=A/K)for(scanf("%d%d",&A,&K);A>K&&A%K;)A-=(1+(A%K-1)/(A/K+1))*(A/K+1);
    puts(g?"Takahashi":"Aoki");
}