[数学杂题 位运算] ZROI 2017 提高6 T1 异或统计
来源:互联网 发布:c语言编程器下载 编辑:程序博客网 时间:2024/05/01 06:12
一眼看上去非常难,其实比较套路。对于与位运算有关的问题,可以尝试每位拆开算,我们把
怎么算后面那项呢?我们可以枚举中间的
然后就很简单了,后面
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=200005,MOD=998244353;typedef long long LL; int n,m,a[maxn],ans,sum[35][2],f1[maxn],f2[maxn];LL Solve(int pos,int k1,int k2){ memset(f1,0,sizeof(f1)); memset(f2,0,sizeof(f2)); memset(sum,0,sizeof(sum)); for(int i=1;i<=n;i++){ for(int j=0;j<=30;j++) (f1[i]+=(LL)(1<<j)%MOD*sum[j][((a[i]>>j)&1)^1]%MOD)%=MOD; if(((a[i]>>pos)&1)==k1) for(int j=0;j<=30;j++) (sum[j][(a[i]>>j)&1]+=1)%=MOD; } memset(sum,0,sizeof(sum)); for(int i=n;i>=1;i--){ for(int j=0;j<=30;j++) (f2[i]+=(LL)(1<<j)%MOD*sum[j][((a[i]>>j)&1)^1]%MOD)%=MOD; if(((a[i]>>pos)&1)==k2) for(int j=0;j<=30;j++) (sum[j][(a[i]>>j)&1]+=1)%=MOD; } int res=0; for(int i=1;i<=n;i++) (res+=(LL)f1[i]*f2[i]%MOD)%=MOD; return res;}int main(){ scanf("%d\n",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=0;i<=30;i++) (ans+=(LL)(1<<i)%MOD*((Solve(i,1,0)+Solve(i,0,1))%MOD)%MOD)%=MOD; printf("%d\n",ans); return 0;}
阅读全文
0 0
- [数学杂题 位运算] ZROI 2017 提高6 T1 异或统计
- [DP] ZROI 2017 提高6 T2 异或统计
- [数位DP] ZROI 2017 提高3 T1 树状数组
- [DP] ZROI 2017 提高3 T3 建筑
- 2017年8月10日提高组T1 数学
- 2017年8月10日提高组T1 数学
- 2017年8月10日提高组T1 数学
- [DP] ZROI 2017提高1 T2.给 Ca
- [DP] ZROI 2017提高 5 T2. 石头剪刀布
- [表达式求值 矩阵乘法] ZROI 2017提高10A. Calc
- 位运算—-异或
- 位异或运算符
- 位运算中的异或运算
- 按位与、或、异或运算
- 按位与、或、异或运算
- 数学与位运算
- 数学 模+位运算
- SSL2676 2017年8月10日提高组T1 数学(快速幂)
- 2017年酸奶市场超速增长,未来纯奶将何去何从?
- 数据结构 中序遍历的堆栈实现法
- JSP学习总结
- Requests库学习笔记
- Agri-Net POJ
- [数学杂题 位运算] ZROI 2017 提高6 T1 异或统计
- [图解数据结构之Java实现](2) --- 线性表之链表实现
- P3851航运调度
- Codeforces 702D Road to Post Office(模拟 + 公式推导)
- 郑州集训DAY3笔记
- css学习-2017.10.7
- C++入门
- 2017.10.07【NOIP提高组】模拟赛B组 Heatwave 题解
- 【Sort】242. Valid Anagram