[BZOJ3609][Heoi2014]人人尽说江南好 结论题

时间:2022-03-27 00:21:10

Description

小 Z 是一个不折不扣的 ZRP(Zealot Round-game Player,回合制游戏*玩家),

最近他 想起了小时候在江南玩过的一个游戏。 
   在过去,人们是要边玩游戏边填词的,比如这首《菩萨蛮》就是当年韦庄在玩游戏时填 的:
    人 人 尽 说 江 南 好, 游 人 只 合 江 南 老。 
   然而我们今天不太关心人们填的词是什么,我们只关心小 Z 那时玩过的游戏。游戏
的规 则是这样的,给定 N 堆石子,每堆石子一开始只有 1 个。小 Z 和他的小伙伴轮
流操作, 小 Z 先行操作。操作可以将任意两堆石子合并成为一堆,当谁不再能操作的
时候,谁就输掉了。 不过,当一堆石子堆的太高时可能发生危险,因此小 Z 和他的小
伙伴规定,任何时刻任意一 堆石子的数量不能超过 m。即假如现在有两堆石子分别有
 a 个和 b 个,而且 a+b>m,那么这 两堆石子就不能合成一堆。 
       小 Z 和他的小伙伴都是很聪明的,所以他们总是会选择对自己最有
利的策略。现在小 Z 想要知道,在这种情况下,对于一个给定的 n 和 m,到底是谁
能够获得胜利呢? 

Input

 本题包括多组数据  数据第一行为一个数 T,为数据组数 
 以下 T 行,每行两个正整数 n,m 

Output

输出 T 行,每行为 0 或 1,如果为 0 意为小 Z(即先手)会取得胜利,为 1 则为后

手会 取得胜利。 

Sample Input


7 3 
1 5
4 3
6 1
2 2

Sample Output

1
1
1
1
0

HINT

100%的数据, n,m<=1000000000, T<=100

Solution

结论题

容易猜到最后的石头一定是$n$堆$m$个的石头,还有一堆$n%m$的石头(如果可以整除就没有这堆)

然后把$m$个石头合并成$1$个石头,需要合并$m-1$次,所以总的合并次数就是$$n/m*(m-1)+(n%m)-1$$

但是如果可以正好分成$m$堆那就得$+1$回去

然后最后得到的合并次数如果是奇数那就后手出,如果是偶数就先手出

#include <bits/stdc++.h>

using namespace std ;

#define ll long long
ll t , n , m ; int main() {
scanf( "%lld" , &t ) ;
while( t -- ) {
scanf( "%lld%lld" , &n , &m ) ;
ll x = 1ll * n / m * ( m - ) + n % m + !( n % m ) - ;
x % ? puts( "" ) : puts( "" ) ;
}
return ;
}