【数学】【位运算】Divan and bitwise operations—CF1614C

2023-10-14 17:04

本文主要是介绍【数学】【位运算】Divan and bitwise operations—CF1614C,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Divan and bitwise operations—CF1614C
参考文章

思路

假设 a a a 数组有 k k k 个数的二进制第 i i i 位上的数字是 1 1 1,那么 a a a 数组中二进制第 i i i 位对答案的贡献为:
w = 2 i − 1 ∗ ( C k 1 + C k 3 + C k 5 + . . . + C k 比 k 小的最大奇数 ) ∗ C k n − k w=2^{i-1}*(C_k^1+C_k^3+C_k^5+...+C_k^{比k小的最大奇数})*C_k^{n-k} w=2i1(Ck1+Ck3+Ck5+...+Ckk小的最大奇数)Cknk
其中, 2 i − 1 2^{i-1} 2i1 表示二进制第 i i i 位的权重; ( C k 1 + C k 3 + C k 5 + . . . + C k 比 k 小的最大奇数 ) (C_k^1+C_k^3+C_k^5+...+C_k^{比k小的最大奇数}) (Ck1+Ck3+Ck5+...+Ckk小的最大奇数) 表示在 k k k 个有序的 1 1 1 排列中,有多少种选法能选出奇数个 1 1 1 C k n − k C_k^{n-k} Cknk 表示在 n − k n-k nk 个有序的 0 0 0 排列中,有多少种选法。
因为
( C k 1 + C k 3 + C k 5 + . . . + C k 比 k 小的最大奇数 ) = 2 k − 1 (C_k^1+C_k^3+C_k^5+...+C_k^{比k小的最大奇数}) = 2^{k-1} (Ck1+Ck3+Ck5+...+Ckk小的最大奇数)=2k1
所以
w = 2 i − 1 ∗ 2 n − 1 w = 2^{i-1}*2^{n-1} w=2i12n1
我们可以看出: a a a 中如果存在数在它的二进制第 i i i 位是 1 1 1,那么第 i i i 位的整体贡献就是定值 2 i − 1 ∗ 2 n − 1 2^{i-1}*2^{n-1} 2i12n1,与 1 1 1 的个数无关。

所以我们现在的任务就变成了寻找一个数 y y y,使得 x x x 中二进制每一位都是 a a a 数组中二进制每一位的按位或,即 y = a 1 , a 2 , a 3 , . . . a n 的按位或 y = a_1, a_2, a_3, ... a_n 的按位或 y=a1,a2,a3,...an的按位或,这很容易做到,让 y y y 与所有的 x x x 按位或即可。

C o d e Code Code

#include <bits/stdc++.h>
#define int long long
#define sz(a) ((int)a.size())
#define all(a) a.begin(), a.end()
using namespace std;
using PII = pair<int, int>;
using i128 = __int128;
const int N = 2e5 + 10;
const int mod = 1e9 +7;int n, m;int qpow(int a, int b) {int res = 1;while (b) {if (b & 1) {res = res * a % mod;}a = a * a % mod;b >>= 1;}return res;
}void solve() {cin >> n >> m;int y = 0;while (m --) {int l, r, x;cin >> l >> r >> x;y |= x;}cout << "          ";cout << y * qpow(2, n - 1) % mod << "\n";
}signed main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);int T = 1;cin >> T; cin.get();while (T --) solve();return 0;
}

这篇关于【数学】【位运算】Divan and bitwise operations—CF1614C的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/211892

相关文章

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

uva 575 Skew Binary(位运算)

求第一个以(2^(k+1)-1)为进制的数。 数据不大,可以直接搞。 代码: #include <stdio.h>#include <string.h>const int maxn = 100 + 5;int main(){char num[maxn];while (scanf("%s", num) == 1){if (num[0] == '0')break;int len =

uva 10014 Simple calculations(数学推导)

直接按照题意来推导最后的结果就行了。 开始的时候只做到了第一个推导,第二次没有继续下去。 代码: #include<stdio.h>int main(){int T, n, i;double a, aa, sum, temp, ans;scanf("%d", &T);while(T--){scanf("%d", &n);scanf("%lf", &first);scanf

uva 10025 The ? 1 ? 2 ? ... ? n = k problem(数学)

题意是    ?  1  ?  2  ?  ...  ?  n = k 式子中给k,? 处可以填 + 也可以填 - ,问最小满足条件的n。 e.g k = 12  - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 with n = 7。 先给证明,令 S(n) = 1 + 2 + 3 + 4 + 5 + .... + n 暴搜n,搜出当 S(n) >=

uva 11044 Searching for Nessy(小学数学)

题意是给出一个n*m的格子,求出里面有多少个不重合的九宫格。 (rows / 3) * (columns / 3) K.o 代码: #include <stdio.h>int main(){int ncase;scanf("%d", &ncase);while (ncase--){int rows, columns;scanf("%d%d", &rows, &col

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

CSP-J基础之数学基础 初等数论 一篇搞懂(一)

文章目录 前言声明初等数论是什么初等数论历史1. **古代时期**2. **中世纪时期**3. **文艺复兴与近代**4. **现代时期** 整数的整除性约数什么样的整数除什么样的整数才能得到整数?条件:举例说明:一般化: 判断两个数能否被整除 因数与倍数质数与复合数使用开根号法判定质数哥德巴赫猜想最大公因数与辗转相除法计算最大公因数的常用方法:举几个例子:例子 1: 计算 12 和 18

【Java中的位运算和逻辑运算详解及其区别】

Java中的位运算和逻辑运算详解及其区别 在 Java 编程中,位运算和逻辑运算是常见的两种操作类型。位运算用于操作整数的二进制位,而逻辑运算则是处理布尔值 (boolean) 的运算。本文将详细讲解这两种运算及其主要区别,并给出相应示例。 应用场景了解 位运算和逻辑运算的设计初衷源自计算机底层硬件和逻辑运算的需求,它们分别针对不同的处理对象和场景。以下是它们设计的初始目的简介:

位运算:带带孩子吧,孩子很强的!

快速进制 在聊到位运算之前,不妨先简单过一遍二进制的东西。熟悉二进制和十进制的快速转换确实是掌握位运算的基础,因为位运算直接在二进制位上进行操作。如果不熟悉二进制表示,很难直观理解位运算的效果。 这里主要涉及二进制和十进制之间的互相转换。 十进制转二进制 十进制转二进制可以使用常见的 除2取余法 进行。每次将十进制除以2并记录所得余数,直到商为0,然后再将记录的余数 从下往上排列即