Kattis xorsequences XOR Sequences
Link
先考虑一个结论,对于\(a,b\)两个非负整数,\(a\operatorname{xor}c\)与\(b\operatorname{xor}c\)的大小关系仅取决于\(c\)的\(a,b\)最高不同位这一位。
考虑对比\(p_i,p_{i+2^{m-1}}\)。
若\(a_i\)的最高位都相同,那么\(\forall i\in[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|i\in[0,2^{m-1})\}\cap\{p_i|i\in[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);
}