[Heoi2014]人人尽说江南好
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 581 Solved: 420
[Submit][Status][Discuss]
Description
小 Z 是一个不折不扣的 ZRP(Zealot Round-game Player,回合制游戏*玩家),
Input
Output
输出 T 行,每行为 0 或 1,如果为 0 意为小 Z(即先手)会取得胜利,为 1 则为后
Sample Input
7 3
1 5
4 3
6 1
2 2
Sample Output
1
1
1
0
HINT
100%的数据, n,m<=1000000000, T<=100
Source
感觉一定最后是m,m,…,n%m。试了试样例发现很对然后就A了><
证明:
无论先手后手,只要想就一定能造出m,m,…,n%m。这样的话此时胜利的人必定会构造这种局面。
1、先手想构造
先手1+1=2
如果此时后手1+2=3,则先手1+3=4
如果此时后手1+1=2,则先手2+2=4
就是说先手可以构造自己放完后只有一堆非1且为偶数
同理后手能构造自己放完后只有一堆非1且为奇数
当m为奇数
{
先手想构造
当先手造出了m-1后,如果后手让m-1加一变成m,则造出一个m同时回到先手行动状态,循环上面过程。
如果后手造一个2,先手补满m。无论后手让1+1=2还是让2+1=3,先手都能把造一堆4,其他都为1,循环上面过程。
后手想构造
后手会把m造出来,此时又轮到先手,循环上面过程。
}
当m为偶数
{
先手想构造
先手会直接把m造出来。后手会让1+1=2。此时等价于造出了一堆m,转化为后手想构造。
后手想构造
后手造出m-1后,如果先手把它补成m,则等价于造出一堆m,转化为先手想构造。如果先手让1+1=2,则后手补出m。此时无论先手让2+1=3还是让1+1=2,后手都把它变为4。现在后手就能构造那一堆是偶数的了,等价于造出一堆m后,变成先手想构造。
发现这两种是交替的
}
构造方法只有在m<=3的情况下不成立,这种情况就易于分析了吧。。
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<cstdio> #define ll long long
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch>''||ch<''){if (ch=='-') f=-;ch=getchar();}
while(ch<=''&&ch>=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
}
int n,m,t,ans;
int main()
{
int cas=read();
while(cas--)
{
n=read(),m=read();
t=n/m;
if(n%m) t++;
ans=n-t;
if(ans%) printf("0\n");
else printf("1\n");
}
}