小Q的无敌异或(第一问)
来源:互联网 发布:淘宝商城会员 编辑:程序博客网 时间:2024/06/10 07:49
Description
背景
小Q学习位运算时发现了异或的秘密。
描述
小Q是一个热爱学习的人,他经常去维基百科(http://en.wikipedia.org/wiki/Main_Page)学习计算机科学。
就在刚才,小Q认真地学习了一系列位运算符(http://en.wikipedia.org/wiki/Bitwise_operation),其中按位异或的运算符 xor 对他影响很大。按位异或的运算符是双目运算符。按位异或具有交换律,即i xor j = j xor i。
他发现,按位异或可以理解成被运算的数字的二进制位对应位如果相同,则结果的该位置为0,否则为1,例如1(01) xor 2(10) = 3(11)。
他还发现,按位异或可以理解成数字的每个二进制位进行了不进位的加法,例如3(11) xor 3(11) = 0(00)。
于是他想到了两个关于异或的问题,这两个问题基于一个给定的非负整数序列A1, A2, …, An,其中n是该序列的长度。
第一个问题是,如果用f(i, j)表示Ai xor Ai+1 xor … xor Aj,则任意的1 <= i <= j <= n的f(i, j)相加是多少。
第二个问题是,如果用g(i, j)表示Ai + Ai+1 + … + Aj,则任意的1 <= i <= j <= n的g(i, j)异或在一起是多少。
比如说,对于序列{1, 2},所有的f是{1, 2, 1 xor 2},加起来是6;所有的g是{1, 2, 1 + 2},异或起来是0。
他觉得这两个问题都非常的有趣,所以他找到了你,希望你能快速解决这两个问题,其中第一个问题的答案可能很大,你只需要输出它对998244353(一个质数)取模的值即可。
Input
第一行一个正整数n,表示序列的长度。
第二行n个非负整数A1, A2, …, An,表示这个序列。
Output
两个整数,表示两个问题的答案,空格隔开,其中第一个问题的答案要对998244353(一个质数)取模。
Sample Input
2
1 2
Sample Output
6 0
HINT
100%的数据满足n <= 10^5, Ai <= 10^6。
第一问思路:假设rox(l,r)表示第l项到第r项的异或值,考虑第k位为1的情况,当且仅当rox(l,r-1)与a[r]第k位的值不同,固定右端点r,我们需要算出的是有多少个l使得rox(l,r)第k位的值为1。然后我们就可以在O(1)的时间内推出右端点r+1的答案。假设num[i-1]表示使得rox(l,r)第k位的值为1的l的数量,那么使得rox(l,r)第k位的值为0的l的数量即为i-1-num[i-1],假设第i个数的第k位上的值为0,那么
num[i]=num[i-1],否则num[i]=i-1-num[i-1]+1,最后统计下每个位的贡献即可,时间复杂度为O(nlogA)。
代码如下
#define LL long long #define ULL unsigned long long #include<bits/stdc++.h>using namespace std;const int maxn = 100010, mod = 998244353;int num[20];LL ans[20];int a[maxn];int n;LL solve(){ int B[20]; for(int k=15;k>=0;k--) B[k]=(a[1]>>k)&1; for(int k=15;k>=0;k--) if(B[k]) num[k]=ans[k]=1; for(int i=2;i<=n;i++) { for(int k=15;k>=0;k--) { B[k]=(a[i]>>k)&1; } for(int k=15;k>=0;k--) { if(B[k]) { num[k]=i-1-num[k]+1; } ans[k]=(ans[k]+num[k])%mod; } } LL ANS=0; for(int i=15;i>=0;i--) { ANS=(ANS+ans[i]*(1<<i)%mod)%mod; } return ANS;}int main() { memset(num,0,sizeof(num)); memset(ans,0,sizeof(ans)); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); printf("%d\n",solve()); return 0;}
- 小Q的无敌异或(第一问)
- BZOJ 4017 小Q的无敌异或
- bzoj 4017 小Q的无敌异或
- bzoj4017 小Q的无敌异或 数学
- 【bzoj4017】小Q的无敌异或 树状数组
- 2017.10.12 小Q的无敌异或 失败总结
- BZOJ4017 小Q的无敌异或 好题
- xian 区域赛 g bzoj 4017: 小Q的无敌异或
- bzoj 4017 小Q的无敌异或(所有子区间异或的和 与和的异或)
- cqoi2017,bzoj4813小Q的棋盘(树形dp或瞎搞)
- NYOJ 懂懒事的小明(小明真厉害,无敌了)
- 超无敌搞笑的 Q 版语文 ^_^
- 小 Q 的棋盘
- 【CQOI2017】小Q的棋盘
- CQOI2017 小Q的棋盘
- 2013腾讯编程马拉松初赛第一场(3月21日)小Q系列故事——电梯里的爱情
- HDOJ4500 小Q系列故事——屌丝的逆袭(简单模拟) &&腾讯2013编程马拉松第0场第一题
- HDOJ4505 小Q系列故事——电梯里的爱情(简单模拟) && 腾讯2013编程马拉松第1场第一题
- Jersey
- CSS清除浮动方法大全
- 软件工程视频学习——第四章——概要设计
- lua自定义迭代器
- 7.6
- 小Q的无敌异或(第一问)
- PL/SQL Server连接64位Oracle数据库在界面中不出现Connect as的解决方法
- CodeForces770C【强连通分量+DFS序】
- ThreadLocal
- SpringBoot使用自定义注解+拦截器 实现日志记录
- Android搜狗输入法搜索栏
- 自定义一个类加载器
- 菜鸟学习数据结构算法之路之斐波那契数列(递归)
- division by zero