• CodeForces 1174D Ehab and the Expected XOR Problem


    题意:
    给定两个数(n)(x),构造一个序列,设为(a[l])((l)不确定)
    (1)(1leq a[i]<2^{n})
    (2)、序列中没有子序列异或和为(0)(x)
    (3)(l)应最长
    分析:
    (1)、设前(i)个数字异或和为(sum_{i}),则对于([i,j])的异或和为(sum_{i}⨁sum_{j-1}),所以我们可以找出(sum)数组,满足

    [forall i,j,sum_{i}oplus sum_{j} eq 0&&sum_{i}oplus sum_{j} eq x ]

    (2)、异或性质有(y⨁z=x),则有(y⨁x=z),且对于任意一个数(y)(z)是惟一的。且由于(y)(z)在二进制下是不可能超过(2^{n})的,因此,相对立的(y)(z)(2^{n})内成对存在,设(i)(1)开始遍历到(2^{n}),我们与将(i)对立的数标记即可,我们可以得到(sum)数组
    (3)(a[i]=sum[i]⨁sum[i-1]),输出数组即可

    #pragma GCC optimize(3, "Ofast", "inline")
    
    #include <bits/stdc++.h>
    
    #define start ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    #define ll long long
    #define int ll
    #define ls st<<1
    #define rs st<<1|1
    #define pii pair<int,int>
    using namespace std;
    const int maxn = (ll) 5e5 + 5;
    const int mod = 1000000007;
    const int mod2 = 1000000006;
    const int inf = (ll) 1e9 + 5;
    bool vis[maxn];
    
    signed main() {
        start;
        int n, x;
        cin >> n >> x;
        vis[x] = vis[0] = true;
        vector<int> ans;
        ans.push_back(0);
        for (int i = (1 << n) - 1; i > 0; --i)
            if (!vis[i]) {
                ans.push_back(i);
                vis[i ^ x] = true;
            }
        cout << ans.size() - 1 << '
    ';
        for (int i = 1; i < ans.size(); ++i)
            cout << (ans[i - 1] ^ ans[i]) << ' ';
        return 0;
    }
    
  • 相关阅读:
    子级必须浮动,父级如何自动适应高度
    如何应用JS来改变CSS样式
    php对多维数组按某值排序的例子
    php socket编程
    HLSL 高级着色语言基础
    谈谈.NET提供的各种记时器
    获取中文字符串的Unicode值的方法!
    Tab键和KeyDown,KeyUp事件
    公有字段和属性的选择!
    C#中汉字的繁体和简体的相互转换的两个方法!
  • 原文地址:https://www.cnblogs.com/F-Mu/p/11609577.html
Copyright © 2020-2023  润新知