xor
题号:NC212840
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

小明现在有一个长度为的数组,其元素分别为
小明现在想将a拆分成若干个连续的子数组,并满足拆分后的每个数组的异或和为
现在小明想知道,在给定数组的情况下,有多少种不同的拆分方案使其满足小明的要求?
由于答案可能很大,请将结果对取余数。
一个数组的异或和可以表示为,其中表示二进制异或。
注解:
异或(xor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为:
a⊕b = (¬a ∧ b) ∨ (a ∧¬b)
异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位,所以异或常被认作不进位加法。

输入描述:

第一行输入两个整数,表示题目描述中的
接下来一行输入个整数,表述数组

输出描述:

每组数据输出一个整数,表示方案数对取余数的结果
示例1

输入

复制
3 1
1 1 1

输出

复制
2

说明

两种拆分方式分别为
[1,1,1]
[1][1][1]
其中,[1][1,1] [1,1][1]的拆分方式不符合题意 因为sum([1,1])=0

备注: