Divan and bitwise operations 异或,同或,组合数学(1500)
题意 :
- 原序列长为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)相关推荐
- C. Divan and bitwise operations
Problem - C - Codeforces C. Divan and bitwise operations time limit per test 1 second memory limit p ...
- Divan and bitwise operations(组合数+思维)
Divan and bitwise operations [Link](Problem - C - Codeforces) 题意 你有一个长度为nnn的数组,但是不知道每个数是什么,接下来给你mmm个 ...
- 在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) 我将省略有关我是如何做到这一点 ...
- 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 ...
- 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 ...
- C语言位运算 Bitwise Operator
Bitwise Operators in C Programming Language When I first learn C, I found it's hard to understand th ...
- Python 的 Magic Methods 指南(转)
介绍 本指南是数月博客的总结.主题是魔术方法. 什么是魔术方法呢?它们是面向对象Python语言中的一切.它们是你可以自定义并添加"魔法"到类中的特殊方法.它们被双下划线环绕(比如 ...
- redis 中一个字段 修改map_Redis bitmap 位图 从入门到精通 基础 实战 妙用
1.bitmap介绍 位图不是真正的数据类型,它是定义在字符串类型中,一个字符串类型的值最多能存储512M字节的内容 位上限:2^(9(512)+10(1024)+10(1024)+3(8b=1B)) ...
- javascript运算符_JavaScript中的按位运算符
javascript运算符 JavaScript按位运算符 (JavaScript Bitwise Operators) A lot of times you come across some str ...
最新文章
- [dp之路]7.25test
- Windows Server 2003 网络互访新特性
- Cheese 游戏编程:第 4 部分 (转自MSDN)
- 颓废了1年+,今天开始勤(tui)奋(fei)啦
- 汽车行业中SOP和PT是什么意思?
- VS Code 修改字体 + 取消注释斜体 + 修改注释颜色
- 【论文笔记】Personalized Federated Learning with Theoretical Guarantees: A MAML Approach
- 人工智能和嵌入式|大数据|云计算等的关系
- crc生成多项式java_CRC 生成多项式
- 演算法 - 分治法(Divide-and-Conquer)
- [安全测试报告]某米摄像头安全体验报告
- 钉钉第三方登录,多地址授权
- linux dd 尾部添加0,Linux命令dd的使用帮助 | Soo Smart!
- 基于java电影票预订管理系统设计与实现
- Get图谱 50个技能领域一键直达
- Linux下查看即时网速(查看网速)
- LTE上行物理层传输机制(3)-上行物理信道和参考信号的位置
- c 语言switch语句举例,C switch 语句 | 菜鸟教程
- 化境ASP无组件上传类
- iPad/iPhone如何设置充电提示音吖?
热门文章
- 程序间数据共享与传递(1):EXPORT/IMPORT、SAP/ABAP Memory
- 设置ALV单元格可编辑状态
- ABAP程序系统字段中英文详解
- SAP系统上线支持维护制度
- 如何查找SAP的旧TCODE对应新的TCODE
- 计算机网络系统结构分析 pdf,计算机网络(实验三:数据包结构分析).pdf
- python生成的exe程序在其他电脑打开报错_9102年你还不会搭建Python环境
- 下方向键_Bash使用$#x27;...#x27;来捕获方向键
- 函数-模块化程序设计
- python flask与django的区别_真正搞明白Python中Django和Flask框架的区别