1. 程式人生 > >[BZOJ3609][Heoi2014]人人盡說江南好

[BZOJ3609][Heoi2014]人人盡說江南好

行為 最有 space 石頭 合成 情況下 而且 一行 namespace

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

5
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 - 1
) + n % m + !( n % m ) - 1 ; x % 2 ? puts( "0" ) : puts( "1" ) ; } return 0 ; }

[BZOJ3609][Heoi2014]人人盡說江南好