[Daimayuan] 异或和(C++,异或,数学)

这篇具有很好参考价值的文章主要介绍了[Daimayuan] 异或和(C++,异或,数学)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

给定一个长度为 n n n 的数组 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an。 请你求出下面式子的模 1 e 9 + 7 1e9+7 1e9+7的值。

∑ i = 1 n − 1 ∑ j = i + 1 n ( a i   X O R   a j ) \sum_{i=1}^{n-1}{\sum_{j=i+1}^{n}{(a_i\ XOR\ a_j)}} i=1n1j=i+1n(ai XOR aj)

输入格式

第一行一个数字 n n n

接下来一行 n n n 个整数 a 1 , a 2 , … , a n a_1,a_2,…,a_n a1,a2,,an

输出格式

一行一个整数表示答案。

样例输入
3
1 2 3
样例输出
6
数据规模

所有数据保证 2 ≤ n ≤ 300000 , 0 ≤ a i < 2 60 2≤n≤300000,0≤a_i<2^{60} 2n300000,0ai<260

解题思路

依照题意,我们只能直接跑二重循环(因为 a i a_i ai a j a_j aj的组合不会重复,也就是说没有子结构的概念),这肯定会 T L E TLE TLE

那么我们考虑异或操作的性质:

异或操作是位操作,无视整个位串的意义,只能看到单个位。——条件(1)

然后重新审视 ∑ i = 1 n − 1 ∑ j = i + 1 n ( a i   X O R   a j ) \sum_{i=1}^{n-1}{\sum_{j=i+1}^{n}{(a_i\ XOR\ a_j)}} i=1n1j=i+1n(ai XOR aj)

这个式子就是对任意两个元素进行异或操作然后做和,也就是说尝试了所有的组合 C n 2 C_n^2 Cn2)。——条件(2)

再来看一下异或操作的性质:同则为假,不同为真。——条件(3)

如何利用三个条件优化算法?这里通过一个简单的例子来理解:

有位串 10000111 1000 0111 10000111,我们对任意两个位进行异或操作,然后做和。很容易发现,其和为 4 ∗ 4 = 16 4*4=16 44=16。就是 1 1 1的数量乘上 0 0 0的数量。

然后我们回去看一眼题中的例子:

	1	2	3
1	1	0	1 -> 2 * 1 = 2
2	0	1	1 -> 2 * 2 = 4
4	0	0	0 -> 0 * 4 = 0

比起之前那个简单的例子,也就是多了个权重,仅此而已。

接下来简单说一下代码如何实现:

我们维护每一个位上 1 1 1(也可以是 0 0 0)出现的次数;

然后遍历每一个位,累计: 0 0 0的数量 ∗ 1 *1 1的数量 ∗ * 权重。

AC代码如下:文章来源地址https://www.toymoban.com/news/detail-429690.html

#include <iostream>
using namespace std;
const int max_len = 60;
const long long max_a = (1LL << 60LL) - 1LL;
const int max_n = 300000;
const long long mod_num = 1e9 + 7;

long long sum[max_len];

inline void read() {
	long long x, idx = 0;
	cin >> x;
	while (x) {
		sum[idx++] += x & 1;
		x >>= 1;
	}
}

int main() {
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) read();
	
	long long ans = 0;
	for (int i = 0; i < max_len; i++) {
		long long power = (1LL << (long long)(i)) % mod_num;
		long long comb = sum[i] * (n - sum[i]) % mod_num;
		ans = (ans + (power * comb) % mod_num) % mod_num;
	}
	cout << ans << endl;
	return 0;
}

到了这里,关于[Daimayuan] 异或和(C++,异或,数学)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CSDN每日一练 |『异或和』『生命进化书』『熊孩子拜访』2023-08-27

    时间限制:1000ms内存限制:256M 题目描述: 小张找到了一个整数 N,他想问问你从 1 到 N 的所有不同整数的异或和是多少, 请你回答他的问题。 输入描述: 第一行包含一个整数 N (1 = N = 100000)。 输出描述: 第一行输出一个整数, 代表从 1 到 N 的所有不同整数的异或和。 🚩

    2024年02月11日
    浏览(47)
  • Codeforces Beta Round 15 C. Industrial Nim Nim,1~n的异或和

    Problem - 15C - Codeforces 目录 Nim游戏: 1~n的异或和: 代码: n个石头堆,谁最后没得取谁败 我用的异或思考法,对所有堆异或。 开局异或和为0的败 最后全是0,异或完也是0. //最后是0,这位就输了 //A选手让异或和为0,B选手必须动一下,而他做任何操作都会使异或和不为0 //这

    2024年02月21日
    浏览(56)
  • 第十四届蓝桥杯省赛 C/C++ A 组 H 题——异或和之和(AC)

    给定一个数组 A i A_i A i ​ ,分别求其每个子段的异或和,并求出它们的和。或者说,对于每组满足 1 ≤ L ≤ R ≤ n 1 leq L leq R leq n 1 ≤ L ≤ R ≤ n 的 L , R L, R L , R ,求出数组中第 L L L 至第 R R R 个元素的异或和。然后输出每组 L , R L, R L , R 得到的结果加起来的值。 输入的第

    2024年02月13日
    浏览(43)
  • 前端算法题——给定一个整数数组,判断是否存在重复元素。

    题目可以理解为如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false。 这题一看就是 计数问题,题目中“如果存在一值在数组中出现至少两次”这句话就告诉我们记录每一个数字出现的次数就能解决问题了。  我们遍历数组时,

    2024年02月20日
    浏览(78)
  • 【LeetCode】每日一题&最后一个单词的长度&投票法求解多数元素&异或操作符巧解只出现一次的数字&整数反转

    ========================================================================= 个人主页直达: 小白不是程序媛 LeetCode系列专栏: LeetCode刷题掉发记 ========================================================================= 目录 LeetCode 58.最后一个单词的长度 LeetCode169.多数元素 LeetCode 136.出现一次的数字 LeetCode 7.整数

    2024年02月08日
    浏览(46)
  • 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标。(哈希法)

    思路: 当题意中需要判断某个元素是否出现过,或者某个元素是否在这个集合里出现过。 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那两个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组

    2024年02月08日
    浏览(53)
  • 【面试经典 150 | 数组】最后一个单词的长度

    本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删: Tag:介绍本题牵涉到的知识点、数据结构; 题目来源:

    2024年04月22日
    浏览(58)
  • C++中变量作为数组长度

    在 C + + C++ C + + 中无法使用变量作为数组长度,必须使用常量 因为数组空间分配在栈内存中,这部分空间大小必须在编译时就确定,不能等到运行时再分配,而常量值编译时就确定,变量须运行时才能确定 因此,想要使用变量声明数组长度,可以选择将数组空间开辟在堆内存

    2024年02月07日
    浏览(27)
  • Java创建一个长度为10的数组,利用Arrays.sort(), 为数组元素排序

    程序要求:1)创建一个整型数组,数组的长度为10.                     2)给数组元素赋值,要求乱序。                   3)利用fori循环将数组元素依次输出。                      4)利用Arrays.sort(), 为数组元素排序                   5)采用增加for循环将

    2024年02月08日
    浏览(50)
  • 两种解法解决LCR 008. 长度最小的子数组【C++】

    😄 创作不易,你的点赞和关注都是对我莫大的鼓励,再次感谢您的观看😄

    2024年02月07日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包