首先枚举 k k k ,先枚举当 k k k 为奇数的情况,当 k = 1 k=1 k=1 的时候,显然 n n n 为奇数的时候先手必胜,此时需要走1步便可通往 P P P 点。
当 k = 3 k=3 k=3 的时候:
下标
0
1
2
3
4
5
6
7
8
9
状态
P P P
N N N
P P P
N N N
P P P
N N N
P P P
N N N
P P P
N N N
同样当 k = 5 k=5 k=5 的时候,状态表跟上图一样;可以发现当 k k k 是奇数的时候,永远满足 n n n 为奇数的时候先手必胜,并且1步可以通往 P P P 点;反之 n n n 为偶数的时候先手必败。
当 k k k 为偶数的时候,画出 k = 2 k=2 k=2 的图如下:
下标
0
1
2
3
4
5
6
7
8
9
状态
P P P
N N N
N N N
P P P
N N N
N N N
P P P
N N N
N N N
P P P
同样画出当 k = 4 k=4 k=4 的时候状态图如下:
下标
0
1
2
3
4
5
6
7
8
9
10
11
状态
P P P
N N N
P P P
N N N
N N N
P P P
N N N
P P P
N N N
N N N
P P P
N N N
可以发现,当 k k k 为偶数的时候,从0开始, k + 1 k+1 k+1 个长度为一个周期,其中当 n % ( k + 1 ) = k n\%(k+1)=k n%(k+1)=k 的时候为 N N N 点,其余 0 到 ( k − 1 ) 0到(k-1) 0到(k−1) 按照奇数的情况。
所以当 n % ( k + 1 ) = k n\%(k+1)=k n%(k+1)=k 时,需要走 k k k 步到达下一个 P P P 点,否则当 n % ( k + 1 ) n\%(k+1) n%(k+1) 为奇数时,走1步便可通往下一个 P P P 点。
#include<bits/stdc++.h>
using namespace std;typedeflonglong ll;typedefunsignedlonglong ull;typedefunsignedint uii;typedef pair<int, ll> pii;
template<typename T>inlinevoidrd(T& x){
int tmp =1;char c =getchar(); x =0;while(c >'9'|| c <'0'){
if(c =='-')tmp =-1; c =getchar();}while(c >='0'&& c <='9'){
x = x *10+ c -'0'; c =getchar();}
x *= tmp;}constint N =2e5+10;constint M =1e7+10;constint mod =1e9+7;constint inf =0x3f3f3f3f;int n, m, k;intmain(){
#ifdef _DEBUG
FILE* _INPUT =freopen("input.txt","r",stdin);// FILE* _OUTPUT = freopen("output.txt", "w", stdout);#endif// !_DEBUGint cas =0, T =0;rd(T);while(T--){
// while (~scanf("%d %d", &n,&k)) {
rd(n),rd(k);if(k &1){
if(n &1)puts("1");elseputs("0");}else{
int tmp = n %(k +1);if(tmp == k)printf("%d\n", k);elseif(tmp &1)puts("1");elseputs("0");}}return0;}