题意 :

  • 原序列长为n,给m个连续子序列的左右端点的下标以及该连续子序列的或和,保证这m个连续子序列的并集包含原序列每一个点,求原序列的所有子序列的异或和,输出任意一种

思路 :

  • 由于位运算对每个位都是独立的,考虑分别对每一位求解
  • 首先看输入的给我们带来什么,对于[l,r]得到的同或和x,考虑它的某一位,如果这一位是0,说明[l,r]每个元素这位都是0,如果这一位是1,至少有1个1,后者没什么用
  • 考虑某一位bit,一共有n个元素,假设有a个1,b个0,显然有a+b=na+b=na+b=n
  • 我们如果要对结果(所有子序列异或和的总和),就要选出若干个元素使它们异或和为1,根据异或和的性质,需要选择奇数个1和若干个(0)0
  • 选奇数个1的方案为Ca1+Ca3+...=2a−1C_{a}^{1}+C_{a}^{3}+... =2^{a-1}Ca1​+Ca3​+...=2a−1,选任意个0的方案为2b2^{b}2b
  • 根据乘法原理,总方案数为2a−1∗2b=2a+b−1=2n−12^{a-1}*2^b=2^{a+b-1}=2^{n-1}2a−1∗2b=2a+b−1=2n−1,在当前bit位上贡献为1<<bit1<<bit1<<bit
  • 所以对于每个位,只要有1,那么这个位对结果的贡献就是2n−1∗(1<<bit)2^{n-1}*(1 << bit)2n−1∗(1<<bit),否则这个位对结果的贡献是0
  • 假设bit位存在1,那么v中就可以拆除一块(1 << bit),我们按照这种方法把v拆成若干个块,每个块都能产生这么多贡献,因此可以直接用v乘上2n−12^{n-1}2n−1得到答案
  • 即,只要看哪些位有1,(1<<bit)∗2n−1(1<<bit)*2^{n-1}(1<<bit)∗2n−1即可,事实上,设置一个初始变量v为00…0,每次读入一个区间,都能知道哪些位现在至少有一个1,这个位可以被累加答案了,v|=x
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <unordered_set>
#include <math.h>
#define endl '\n'
#define fi first
#define se second
#define pb push_backusing namespace std;
using ll = long long;typedef pair<int, int> PII;const ll mod = 1e9 + 7;void solve()
{int n, m, v = 0; cin >> n >> m;for (int i = 1, l, r, x; i <= m && cin >> l >> r >> x; i ++ ) v |= x;ll fac = 1;for (int i = 1; i <= n - 1; i ++ ) fac = fac * 2ll % mod;cout << fac * v % mod << endl;
}int main()
{cin.tie(nullptr) -> sync_with_stdio(false);int _;cin >> _;while (_ -- )solve();return 0;
}

Divan and bitwise operations 异或,同或,组合数学(1500)相关推荐

  1. C. Divan and bitwise operations

    Problem - C - Codeforces C. Divan and bitwise operations time limit per test 1 second memory limit p ...

  2. Divan and bitwise operations(组合数+思维)

    Divan and bitwise operations [Link](Problem - C - Codeforces) 题意 你有一个长度为nnn的数组,但是不知道每个数是什么,接下来给你mmm个 ...

  3. 在php中将5按位与运算,PHP 5.2和PHP 5.3中对大整数的按位运算(Bitwise operations on big integers in PHP 5.2 and PHP 5.3)...

    PHP 5.2和PHP 5.3中对大整数的按位运算(Bitwise operations on big integers in PHP 5.2 and PHP 5.3) 我将省略有关我是如何做到这一点 ...

  4. Codeforces Round #757 (Div. 2)

    A. Divan and a Store B. Divan and a New Project C. Divan and bitwise operations D1. Divan and Kostom ...

  5. Codeforces Round #647 (Div. 2) - Thanks, Algo Muse!B. Johnny and His Hobbies(异或)---题解

    来源:http://codeforces.com/contest/1362/problem/B Among Johnny's numerous hobbies, there are two seemi ...

  6. C语言位运算 Bitwise Operator

    Bitwise Operators in C Programming Language When I first learn C, I found it's hard to understand th ...

  7. Python 的 Magic Methods 指南(转)

    介绍 本指南是数月博客的总结.主题是魔术方法. 什么是魔术方法呢?它们是面向对象Python语言中的一切.它们是你可以自定义并添加"魔法"到类中的特殊方法.它们被双下划线环绕(比如 ...

  8. redis 中一个字段 修改map_Redis bitmap 位图 从入门到精通 基础 实战 妙用

    1.bitmap介绍 位图不是真正的数据类型,它是定义在字符串类型中,一个字符串类型的值最多能存储512M字节的内容 位上限:2^(9(512)+10(1024)+10(1024)+3(8b=1B)) ...

  9. javascript运算符_JavaScript中的按位运算符

    javascript运算符 JavaScript按位运算符 (JavaScript Bitwise Operators) A lot of times you come across some str ...

最新文章

  1. [dp之路]7.25test
  2. Windows Server 2003 网络互访新特性
  3. Cheese 游戏编程:第 4 部分 (转自MSDN)
  4. 颓废了1年+,今天开始勤(tui)奋(fei)啦
  5. 汽车行业中SOP和PT是什么意思?
  6. VS Code 修改字体 + 取消注释斜体 + 修改注释颜色
  7. 【论文笔记】Personalized Federated Learning with Theoretical Guarantees: A MAML Approach
  8. 人工智能和嵌入式|大数据|云计算等的关系
  9. crc生成多项式java_CRC 生成多项式
  10. 演算法 - 分治法(Divide-and-Conquer)
  11. [安全测试报告]某米摄像头安全体验报告
  12. 钉钉第三方登录,多地址授权
  13. linux dd 尾部添加0,Linux命令dd的使用帮助 | Soo Smart!
  14. 基于java电影票预订管理系统设计与实现
  15. Get图谱 50个技能领域一键直达
  16. Linux下查看即时网速(查看网速)
  17. LTE上行物理层传输机制(3)-上行物理信道和参考信号的位置
  18. c 语言switch语句举例,C switch 语句 | 菜鸟教程
  19. 化境ASP无组件上传类
  20. iPad/iPhone如何设置充电提示音吖?

热门文章

  1. 程序间数据共享与传递(1):EXPORT/IMPORT、SAP/ABAP Memory
  2. 设置ALV单元格可编辑状态
  3. ABAP程序系统字段中英文详解
  4. SAP系统上线支持维护制度
  5. 如何查找SAP的旧TCODE对应新的TCODE
  6. 计算机网络系统结构分析 pdf,计算机网络(实验三:数据包结构分析).pdf
  7. python生成的exe程序在其他电脑打开报错_9102年你还不会搭建Python环境
  8. 下方向键_Bash使用$#x27;...#x27;来捕获方向键
  9. 函数-模块化程序设计
  10. python flask与django的区别_真正搞明白Python中Django和Flask框架的区别