SWJTU oj Short Problem(异或求和)
2017-03-15 18:54
274 查看
Short Problem
发布时间: 2017年3月15日 12:14 时间限制: 1000ms 内存限制: 128M
描述
作为一个acmer最不能忍受的就是for循环两圈,因为很容易得到TLE,所以希望你们能优化下面的程序,由于结果可能很大,只要输出sum%mod的值即可(sum初始值为0,”^”表示异或操作)。
2271.jpg
输入
输入第一行为T(T≤2000),表示测试的数据组数,第二行到T+1行,每行5个数字,分别为a,b,c,d,mod (1≤a,b,c,d<2^31,a≤b,c≤d,1≤mod≤1,000,000,007).
输出
每行输出sum%mod的值即可.
样例输入1 复制
2
9 12 5 11 83
1 1 2 2 3
样例输出1
24
0
题解:
首先,需要将每个数化成二进制后考虑每个位上的1和0的个数来算。
如何快速求出一个区间内某位上1或0的个数呢:
符合 x mod 2^k >=2^(k-1) 的 x 第k位就是1,通过同余就可以求出1~a第k位是1的位数,然后减一减就是区间了。
最后对于每一位0和1的对数再乘上2^k-1就是对答案的贡献。
发布时间: 2017年3月15日 12:14 时间限制: 1000ms 内存限制: 128M
描述
作为一个acmer最不能忍受的就是for循环两圈,因为很容易得到TLE,所以希望你们能优化下面的程序,由于结果可能很大,只要输出sum%mod的值即可(sum初始值为0,”^”表示异或操作)。
2271.jpg
输入
输入第一行为T(T≤2000),表示测试的数据组数,第二行到T+1行,每行5个数字,分别为a,b,c,d,mod (1≤a,b,c,d<2^31,a≤b,c≤d,1≤mod≤1,000,000,007).
输出
每行输出sum%mod的值即可.
样例输入1 复制
2
9 12 5 11 83
1 1 2 2 3
样例输出1
24
0
题解:
首先,需要将每个数化成二进制后考虑每个位上的1和0的个数来算。
如何快速求出一个区间内某位上1或0的个数呢:
符合 x mod 2^k >=2^(k-1) 的 x 第k位就是1,通过同余就可以求出1~a第k位是1的位数,然后减一减就是区间了。
最后对于每一位0和1的对数再乘上2^k-1就是对答案的贡献。
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<set> #include<ctime> #include<queue> #include<cmath> #include<algorithm> #define PI acos(-1.0) using namespace std; typedef long long LL; int T; LL pp[50]; LL a,b,c,d,mod; LL X1[50],X0[50],Y1[50],Y0[50]; void init(){ pp[0]=1; for(int i=1;i<=31;i++){ pp[i]=pp[i-1]*2; } } LL cal(LL a,int i){ return (a/pp[i])*(pp[i-1])+(a%pp[i]>=pp[i-1]?a%pp[i]-pp[i-1]+1:0); } int main() { init(); scanf("%d",&T); while(T--){ scanf("%lld%lld%lld%lld%lld",&a,&b,&c,&d,&mod); for(int i=1;i<=31;i++){ LL t1=cal(a-1,i); LL t2=a-t1; LL t3=cal(b,i); LL t4=b+1-t3; X1[i]=t3-t1; X0[i]=t4-t2; } for(int i=1;i<=31;i++){ LL t1=cal(c-1,i); LL t2=c-t1; LL t3=cal(d,i); LL t4=d+1-t3; Y1[i]=t3-t1; Y0[i]=t4-t2; } LL ans=0; for(int i=1;i<=31;i++){ ans=(ans+((X1[i]*Y0[i]%mod)*pp[i-1])%mod)%mod; ans=(ans+((Y1[i]*X0[i]%mod)*pp[i-1])%mod)%mod; } printf("%lld\n",ans); } return 0; }
相关文章推荐
- 第十五周oj刷题——Problem M: C++习题 矩阵求和--重载运算符
- 杭电OJ-1001-(Sum Problem大整数求和问题)
- 算法之路之征服上海交大的oj-求和游戏
- 【嵙大OJ】Problem 1217: 编写函数:浮点数取整 (Append Code)
- 【嵙大OJ】Problem 1053 ~ 1055:Matrix Problem
- OJ第二批——Problem B:处理成绩(C++类训练)
- 第十六周oj刷题——Problem F: B 统计程序设计基础课程学生的平均成绩
- OJ第三批——Problem E:C++习题 输入输出--私有继承
- The 3n + 1 problem(南阳oj271)(打表法)
- OJ第四批——Problem A: 多重继承 日期与时间
- 贪心 FZU 2013 A short problem
- YTU-OJ-Problem E: 类的应用
- 第15周 oj Problem H: 判断字符串是否为回文
- 南阳oj 素数求和问题
- CSU 1325 A very hard problem (莫比乌斯反演+分块求和优化)
- 九度OJ 1051 数字阶梯求和
- oj刷题 Problem C: 五位以内的对称素数
- 哈理工OJ 1739 Sort Problem(选择排序)
- oj Problem C: C语言习题5.26--文件操作3
- 位运算 - 异或求和