zoukankan      html  css  js  c++  java
  • bzoj 3687 bitset的运用

     题目大意:

    小呆开始研究集合论了,他提出了关于一个数集四个问题:
    1. 子集的异或和的算术和。
    2. 子集的异或和的异或和。
    3. 子集的算术和的算术和。
    4. 子集的算术和的异或和。
    目前为止,小呆已经解决了前三个问题,还剩下最后一个问题还没有解决,他决定把
    这个问题交给你,未来的集训队队员来实现。
    【输入格式】
    从 xor.in 中输入数据
    第一行,一个整数 n。
    第二行,n 个正整数,表示 a1, a2, …, an
    【输出格式】
    输出到 xor.out 中
    一行,包含一个整数,表示所有子集和的异或和。
    【样例输入】
    2
    1 3
    【样例输出】
    6
    【样例解释】
    6 = 1 ⊗ 3 ⊗ (1 + 3)
    【数据规模与约定】
    数据分为 A,B,C 三类。
    A 类数据 (20%) 保证:ai > 0,1 ≤ n ≤ 10。
    B 类数据 (40%) 保证:ai > 0,1 ≤ n ≤ 1000,
    ∑ ai ≤ 10000。
    C 类数据 (40%) 保证:ai > 0,1 ≤ n ≤ 1000,
    ∑ ai ≤ 2000000。
    另外,不保证集合中的数满足互异性,即有可能出现 ai = aj 且 i ̸= j。

    这里保证不超过2000000,可以利用每一位代表是否存在奇数个异或值

     1 #include <iostream>
     2 #include <bitset>
     3 #include <cstdlib>
     4 #include <ctime>
     5 #include <cstdio>
     6 #include <cmath>
     7 using namespace std;
     8 
     9 bitset<2000000> bt;
    10 void solve()
    11 {
    12    // freopen("in.txt" , "r" , stdin);
    13     int n;
    14     scanf("%d" , &n);
    15     bt[0] = 1;
    16     int sum = 0;
    17     while(n--)
    18     {
    19         int u ;
    20         scanf("%d" , &u);
    21         sum += u;
    22         bt ^= bt<<u;
    23     }
    24     int ret = 0;
    25     for(int i=0 ; i<=sum ; i++){
    26         if(bt[i]) {
    27             ret ^= i;
    28         }
    29     }
    30     printf("%d
    " , ret);
    31 }
    32 
    33 int main()
    34 {
    35     solve();
    36 }
  • 相关阅读:
    访问者模式:男人女人区别
    享元模式:开发多个网站实例
    中介者模式:联合国实例
    职责链模式:加薪实例
    命令模式:烤羊肉串实例
    桥接模式:手机软件实例
    单例模式
    组合模式:公司管理系统实例
    备忘录模式:游戏进度实例
    适配器模式:篮球翻译实例
  • 原文地址:https://www.cnblogs.com/CSU3901130321/p/4736448.html
Copyright © 2011-2022 走看看