• Kattis xorsequences XOR Sequences


    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);
    }
    
  • 相关阅读:
    UU跑腿
    Java基础之接口与抽象类的区别
    经典面试题:Redis为什么这么快?
    isBlank与isEmpty
    阅读联机API文档
    从文本中取出链接地址 并检测链接地址能否打开
    2019-01-19=树莓派学习总结
    单片机知识点
    Linux 编程题
    嵌入式基础知识
  • 原文地址:https://www.cnblogs.com/cjoierShiina-Mashiro/p/12655629.html
Copyright © 2020-2023  润新知