对于式子(((A^B)^B)^B)……,即A对B进行连续异或时,可以发现有如下规律:
若B为1,式子的值会在每次异或之后取反,因为0^1=1,1^1=0,……
若B为0,式子的值会保持A值不变,因为0^0=0,1^0=1,……
因而这种性质可以利用在POJ1830这样的有关联的开关问题上:(每个开关只能改变一次)
假设开关1和开关2、3相关联,且开关1的初始状态为0,终态为1,。
用1表示该开关被改变过,0表示未被改变。
则开关1到达终态的情况可能有:①只改变开关1 ②改变开关1、2、3
则对应的异或式子为 ①((1^0)^0)=1 ②((1^1)^1)=1。
同样的对于开关2和开关3可以列出相应的式子,此时将开关是否被操作过设置为变量x1,x2,x3。
列出3条方程组,等式右边1表示与初始状态不同,0表示与初始状态相同。
解的数目即为到达终态的情况数目,每组解对应着一个开关操作情况。
对于题目的第一个测试用例列出的异或方程为
①x1^x2^x3=1
②x1^x2^x3=1
③x1^x2^x3=1
可求出自由变量有2个,则情况总数为1<<2=4。
对于求解异或方程组,和普通的加减方程组是一样的,只需要将加减操作换成异或操作,高斯消元化简后求出自由变量的数目。
第二个测试用例列出的矩阵为
1 1 0 1 1 1 0 1
1 1 0 0