三大死亡圣器之一的老魔杖,被誉为最强魔杖,被Harry掰断后扔在悬崖下。某一天,小A有幸在悬崖下捡到了这根魔杖,然而由于损坏严重,所以只能施一些简单的小魔法。 恰好魔法界新兴起了一种小游戏,这个游戏是这样的: 地上有一些砖块,每一块的长度都是1,2,3,4中的一个整数。每次一个人可以进行两种操作中的一种: 1.使用“粉身碎骨”咒,粉碎n个长度为n的砖块. 2.使用“变形咒”,把一个长度大于1的砖块分为两个长度大于0的砖块。 当某个人无法使用魔法时即算输。 每次游戏的初始局面是随机生成的。然而小A还有一个迷之身份一一欧握儿,所以他可以作弊,当给出一个局面时,就知道先手能否必胜,但是小A忘记了带电脑,如果你能帮 小A作弊,小A就会将老魔杖送给你。
输入的第一行包含一个整数T,表示数据组数。 接下来有T组,每组四个整数a,b,c,d,表示长度为1,2,3,4的砖块分别有多少个。
输出T行,每行一个整数,1表示先手必胜,0表示先手必败。
对于30%数据满足:a+2b+3c+4d≤10 对于70%数据满足:max{a,b,c,d}≤14 对于100%数据满足:T≤10,max{a,b,c,d}≤1010000
找出规律:用abcd分别表示1、2、3、4的数量,则当(a+c)%2==(b+d)%3时为必败态,此外均为必胜态。
大数的处理,本题只需求出对2、3取模的余数,对2取模只需判断最后一位,对3取模可以将各位数字求和后取模。
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; int main() { int n; scanf("%d",&n); getchar(); while(n--) { char a[10010],b[10010],c[10010],d[10010]; scanf("%s %s %s %s",a,b,c,d); int b1=0,d1=0; int x,y; for(int i=0;i<strlen(b);i++) { b1+=b[i]-'0'; } for(int i=0;i<strlen(d);i++) { d1+=d[i]-'0'; } x=((a[strlen(a)-1]-'0')+(c[strlen(c)-1]-'0'))%2; y=(b1+d1)%3; if(x==y) { printf("0\n"); } else { printf("1\n"); } } return 0; }