Link
先考虑一个结论,对于(a,b)两个非负整数,(aoperatorname{xor}c)与(boperatorname{xor}c)的大小关系仅取决于(c)的(a,b)最高不同位这一位。
考虑对比(p_i,p_{i+2^{m-1}})。
若(a_i)的最高位都相同,那么(forall iin[0,2^{m-1}),p_i=p_{i+2^{m-1}}),且此时(a_i)的最高位有(0,1)两种选择。然后我们可以把(a_i)的最高位去掉,递归考虑(p_0,cdots,p_{2^{m-1}-1})。
否则({p_i|iin[0,2^{m-1})}cap{p_i|iin[2^{m-1},2^m)}=varnothing),且此时所有(a_i)的最高位都是确定的。然后我们可以把(a_i)的最高位去掉,递归考虑(p_0,cdots,p_{2^{m-1}-1})和(p_{2^{m-1}},cdots,p_{2^m-1})。
那么我们只需要判断({p})是否满足上述条件中的任意一个即可,若两个都无法满足则说明无解。
#include<set>
#include<cstdio>
#include<vector>
using vec=std::vector<int>;
const int P=1000000007;
int ans=1,n,m;
int read(){int x;scanf("%d",&x);return x;}
void mul(int&x){x+=x-P,x+=x>>31&P;}
void solve(vec a,int d)
{
if(!~d) return ;
vec l=vec(a.begin(),a.begin()+(1<<d)),r=vec(a.begin()+(1<<d),a.end());int f=1;std::set<int>s;
for(int i=0;i<1<<d;++i) f&=l[i]==r[i];
if(f) return solve(l,d-1),mul(ans),void();
for(int x:l) s.insert(x);
for(int x:r) if(s.count(x)) ans=0;
solve(l,d-1),solve(r,d-1);
}
int main()
{
m=read(),n=read();vec a(1<<m);
for(int i=0;i<1<<m;++i) a[i]=read();
solve(a,m-1),printf("%d",ans);
}