xmu 1254.异或求和
Total Submissions: 52 (19 users) Accepted: 13 (7 users)
给你2个区间[A,B]和[C,D],现在只要求你求出区间[A,B]和[C,D]内任意2个整数异或后的和,因为答案可能会很大,你只需将结果%mod即可。
For(i:A→B)
For(j:C→D)
Sum += (i^j);
输入第一行为T(T<=15),表示测试的数据组数,第2行到T+1行,每行5个数 字,分别为A,B,C,D,mod(1<=A,B,C,D<2^31,A<=B,C<=D,1<=mod& lt;=1,000,000,007),即为上述的数值。
输出有T行,每行有一个数字,代表题述的答案(即Sum % mod)。
3
5 11 9 12 43
9 12 5 11 83
1 1 2 2 3
18
24
0
//这题是我无意间看到的、不会做,然后也没找到题解,就把题目发到 ACMDIY群面//然后晚上群里一位上海交大的童鞋给了我思路//就是把每个数看成二进制数 求区间里面 第k位1有几个比如 区间 【1,8】 那么 区间里面第一位是1的有4个 第二位 是1的4个 第3位是1个是4个 第4位是1的有1个(只要把这8个数写成二进制,就可以看出来)当时我也想过这样、问题是我求不来区间里面这些数中有几个第k位是1然后他告诉我 符合 x mod 2^k >=2^(k-1) 的 x 第k位就是1这样只要求出 x某个范围 ,其它就是它的等价类了 这样就可以很快求出 区间【1,N】里面 第k位是1个数 (1<=k<=31)那么区间【A,B】里面第k位是1的个数就有了然后 就是怎么求和了 求和比较简单 就是 :(区间【A,B】第k位为1的个数乘以区间【C,D】第k位为0的个数+区间【A,B】第k位为0的个数乘以区间【C,D】第k位为1的个数)*2^(k-1) #include <iostream> #include <map> #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <algorithm> using namespace std; #define __int64 long long struct node {__int64 rc[32][2]; }; void get1(__int64 n,node *R) {int i;__int64 t=4,p=2;R->rc[1][1]=n/2;if(n%2) R->rc[1][1]++;for(i=2;p<=n;t=(t<<1)){R->rc[i][1]=(n/t)*(t-p);if(n%t>=p) R->rc[i][1]+=(n%t-p+1);i++;p=(p<<1);}} int main() {node a,b,c,d;int A,B,C,D;int Mod,T;scanf("%d",&T);while(T--){scanf("%d %d %d %d %d",&A,&B,&C,&D,&Mod);memset(a.rc,0,sizeof(a.rc));memset(b.rc,0,sizeof(b.rc));memset(c.rc,0,sizeof(c.rc));memset(d.rc,0,sizeof(d.rc));get1(A-1,&a);get1(B,&b);int i;for(i=1;i<=31;i++)a.rc[i][1]=b.rc[i][1]-a.rc[i][1];__int64 len=(B-A+1);for(i=1;i<=31;i++)a.rc[i][0]=len-a.rc[i][1];get1(C-1,&c);get1(D,&d);for(i=1;i<=31;i++)c.rc[i][1]=d.rc[i][1]-c.rc[i][1];len=(D-C+1);for(i=1;i<=31;i++)c.rc[i][0]=len-c.rc[i][1];__int64 sum=0,m=1;for(i=1;i<=31;i++){sum=(sum+(m<<(i-1))%Mod*(a.rc[i][0]%Mod*c.rc[i][1]%Mod+a.rc[i][1]%Mod*c.rc[i][0]%Mod)%Mod)%Mod;}Mod=(int)sum;printf("%d\n",Mod);}return 0; }
转载于:https://www.cnblogs.com/372465774y/archive/2012/10/22/2734012.html
xmu 1254.异或求和相关推荐
- 个位数不含4用计算机表示,计算机组成原理
1.真值和机器数的关系是什么? 答:在计算机内部用二进制编码表示的数称为机器数,而机器数真正的值(即原来带有正负号的数)称为机器数的真值. 2.什么是编码? 答:用少量简单的基本符号,对大量复杂多样的 ...
- 直接序列扩频通信系统
代码下载:https://download.csdn.net/download/xvrixingkong/10968192 一.系统功能描述: 实现如下图所示的直接序列扩频通信系统. 信源--不断发送 ...
- 原码/补码的加减运算and溢出判断
小数点的处理: 任意一个二进制数S都可以表示为 研究小数点就要研究阶码E的取值: 若E=0,则表示纯小数--代表定点小数: 例0.1111表示+0.1111,1.1111表示-0.1111. 若E=n ...
- Bzoj3687简单题(bitset)
题意 给定一个含nnn(n<1000n<1000n<1000)个正整数(Σa\Sigma{a}Σa≤2e6≤2e6≤2e6)的集合,求其子集和的异或和. 思路 枚举子集显然是会超时的 ...
- 浮点数的加减运算(阶码、尾数)
浮点数尾数运算 < ---- > 原码加/减运算 原码:+|x| 或者 -|x| (正数=0+|x| 负数的=1+|x| ) 符号位和数值部分:分开处理 仅对[数值 ...
- 计算机组成原理实验运动码表,计算机组成原理
1.真值和机器数的关系是什么? 答:在计算机内部用二进制编码表示的数称为机器数,而机器数真正的值(即原来带有正负号的数)称为机器数的真值. 2.什么是编码? 答:用少量简单的基本符号,对大量复杂多样的 ...
- 安全多方计算之GMW协议
安全多方计算之GMW协议 一.背景 论文原文<How to play any mental game>.作者:Micali S, Goldreich O, Wigderson A. 发表 ...
- 找工作要复习的那些点
2021年离职计划:30岁之前,还是期望在大厂工作,期望薪资是50万/年.涨幅在30%,工作地点在杭州/上海 时间 动作 2021:02:01 2021:02:01~~2021:02:20 todo: ...
- 【密码学基础】08 随机位生成和流密码
随机位生成和流密码 1. 随机位生成 1.1 伪随机数 1.1.1 伪随机数生成的原理 1.1.2 伪随机数生成 1.1.2.1 线性同余生成器 1.1.2.2 BBS生成器 1.1.2.3 用分组密 ...
最新文章
- 公开课报名 | 基于自定义模板的OCR结果的结构化处理技术
- 科略教育——执行力的3W管理法
- ASP.NET Core 中文文档 第四章 MVC(4.2)控制器操作的路由
- 腾讯微博Android客户端开发——OAuth认证介绍
- nginx 1.14.0 配置部署 thinkphp 5.1
- QuickBI助你成为分析师-邮件定时推送
- 产品经理学技术之数据结构
- Spark StreamingContext创建方式
- 54. mysqli 扩展库
- 【284天】每日项目总结系列022(2017.11.16)
- 在Web网页里面实现像Excel/WPS条件格式那样根据数据大小自动改变背景颜色(网页数据热力图实现方法)
- Stata作回归分析
- 如何用HTML和css实现拼图,打造自己的html5拼图小游戏
- Docker神器之百度云下载(群辉 LEDE)
- 拉了300M的网,下载速度为啥还是这么慢?计算机基础(五)之网络层完结
- 【opencv】19.图像边缘检测算子数学原理、像素一二阶导数的意义
- Python开发Windows桌面应用程序(一)PyCharm+PyQt5开发环境搭建
- iOS 工作中遇到的问题(面试重点)
- QT窗口嵌入桌面内部(在桌面图标之上):可以实现自定义桌面
- RSSI,RSRP,RSRQ and SINR