牛客国庆集训派对Day4.B.异或求和(按位统计)
刷牛客一战到底做到的,感觉还挺有趣...
\(Description\)
求给定\(n\)及序列\(A_i\),求$$\sum_{i\lt j\lt k}(A_i\oplus A_j)(A_j\oplus A_k)(A_i\oplus A_k)$$
\(n\leq10^5,\ A_i\leq10^9\)。
\(Solution\)
首先有一个\(O(n\log^2n)\)的做法,代码这里有,看来是跑不过去..(不知道提交记录里有没有过的)

来自国庆正睿dls课件。
能跑过的做法:
注意,口胡的,不保证正确性= =(但是算法是对的)(没办法啊找不到题解,还比较赶时间...)
当然还是想拆开乘法按位统计。
考虑枚举每一个异或结果\(2^x\)的贡献:$$Ans=\sum_{i=0}{29}\sum_{j=0}{29}\sum_{k=0}{29}2{i+j+k}\times ?$$
乘上多少呢?现在我们需要统计\(A_i\oplus A_j\)在第\(i\)为\(1\),且\(A_j\oplus A_k\)在第\(j\)位为\(1\),且\(A_k\oplus A_i\)在第\(k\)位为\(1\)的方案数(不要弄混...\(A_i\)中的\(i\)就是下标,外面的\(i\)是枚举的\(2^i\))。
考虑枚举\(A_i\)第\(i\)位是\(0\)还是\(1\),设为\(a\),那么\(A_j\)的第\(i\)位是\(a\oplus1\);同理枚举\(A_j\)的第\(j\)位是\(b\),那么\(A_k\)的第\(j\)位是\(b\oplus1\);同理枚举\(A_k\)的第\(k\)位的\(c\),那么\(A_i\)的第\(k\)位是\(c\oplus1\)。(这么打累死我了...)
那么合法的\(A_i\)就是,第\(i\)位为\(a\)且第\(k\)位为\(c\oplus1\)的数字,\(A_j,A_k\)同理...
所以记\(cnt[i][j][a][b]\)表示第\(i\)位为\(a\),第\(j\)位为\(b\)的\(A_x\)有多少个,乘起来就OK了。
预处理\(cnt\)的复杂度是\(O(n\log^2n)\),常数很小。最后求和的复杂度是\(O(2^3\log^3n)\)。
答案最后除个\(6\)。
//97ms 1892KB
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
//#define gc() getchar()
#define mod 998244353
#define inv6 166374059
#define MAXIN 500000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=31;
int cnt[N][N][2][2],pw[N<<2];
char IN[MAXIN],*SS=IN,*TT=IN;
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-48,c=gc());
return now;
}
inline int Calc(int i,int j,int x,int y)
{
if(i>j) std::swap(i,j), std::swap(x,y);
return cnt[i][j][x][y];
}
int main()
{
int n=read();
for(int i=1; i<=n; ++i)
{
int x=read();
for(int a=0; a<N; ++a)
for(int b=a; b<N; ++b) ++cnt[a][b][x>>a&1][x>>b&1];
}
pw[0]=1;
for(int i=1; i<90; ++i) pw[i]=pw[i-1]<<1, pw[i]>=mod&&(pw[i]-=mod);
LL ans=0;
for(int i=0; i<N; ++i)
for(int j=0; j<N; ++j)
for(int k=0; k<N; ++k)
for(int a=0; a<2; ++a)
for(int b=0; b<2; ++b)
for(int c=0; c<2; ++c)
ans+=1ll*pw[i+j+k]*Calc(i,k,a,c^1)%mod*Calc(i,j,a^1,b)%mod*Calc(j,k,b^1,c)%mod;
printf("%lld\n",ans%mod*inv6%mod);
return 0;
}
牛客国庆集训派对Day4.B.异或求和(按位统计)的更多相关文章
- 牛客国庆集训派对Day4 J-寻找复读机
链接:https://www.nowcoder.com/acm/contest/204/J 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言20 ...
- 牛客国庆集训派对Day4 I-连通块计数(思维,组合数学)
链接:https://www.nowcoder.com/acm/contest/204/I 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言20 ...
- 2018 牛客国庆集训派对Day4 - H 树链博弈
链接:https://ac.nowcoder.com/acm/contest/204/H来源:牛客网 题目描述 给定一棵 n 个点的树,其中 1 号结点是根,每个结点要么是黑色要么是白色 现在小 Bo ...
- 牛客国庆集训派对Day4 Solution
A 深度学习 puts(n) #include <bits/stdc++.h> using namespace std; int main() { double n; while ( ...
- 线性基求交(2019牛客国庆集训派对day4)
题意:https://ac.nowcoder.com/acm/contest/1109/C 问你有几个x满足A,B集合都能XOR出x. 思路: 就是线性基求交后,有几个基就是2^几次方. #defin ...
- 牛客国庆集训派对Day6 A Birthday 费用流
牛客国庆集训派对Day6 A Birthday:https://www.nowcoder.com/acm/contest/206/A 题意: 恬恬的生日临近了.宇扬给她准备了一个蛋糕. 正如往常一样, ...
- 2019牛客国庆集训派对day5
2019牛客国庆集训派对day5 I.Strange Prime 题意 \(P=1e10+19\),求\(\sum x[i] mod P = 0\)的方案数,其中\(0 \leq x[i] < ...
- 2019 牛客国庆集训派对day1-C Distinct Substrings(exkmp+概率)
链接:https://ac.nowcoder.com/acm/contest/1099/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...
- 牛客国庆集训派对Day1 L-New Game!(最短路)
链接:https://www.nowcoder.com/acm/contest/201/L 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言20 ...
随机推荐
- java Swing组件和事件处理
1.常见的容器 JComponent是 Container 的子类,中间容器必须添加到底层容器中才能够发挥作用, JPanel 面板 :使用jPanel 创建一个面板,再通过添加组件到该面板上面,JP ...
- vsftpd中的local_umask和anon_umask
umask是在linux中常见的一个东西,它其实是一个掩码.当然,也有umask这样一个命令,它是对用户建立的文件的默认属性的定义.该 定义为: 假设umask为022,则对于一个文件夹的话,它的默认 ...
- 卸载列表信息——Uninstall注册表
今天用InstallShield打包了一个安装程序,安装顺利完成了,但是当我去控制面板准备卸载时,发现我的程序没有详细的信息,正常的软件信息如下图: 而我的程序没有发布者,大小和版本,也没有图标,于是 ...
- data-key
在foreach或者each循环中给按钮赋予值 html中:data-key="@config.key" js里获取值: var key = $(this).data(" ...
- Zabbix监控——Zabbix自定义用户参数制作监控项
https://blog.51cto.com/183530300/2087774 https://www.cnblogs.com/richardzgt/articles/7889404.html
- jquery .On()绑定事件的触发机制
选择器只能选择已存在元素,其他元素需要作为参数传递给on
- Python_os模块
os模块:可以处理文件和目录,是Python系统和操作系统进行交互的一个接口 os模块常用方法: os.getcwd(): 获取当前工作目录,(即当前Python脚本工作的目录路径) os.chdir ...
- js拷贝
现在有一个对象 var obj = { name: '隔壁老王', age: 60, sex: 'male' } 我们现在想把obj里的每一个属性拷贝到一个空对象var obj1 = {}中,那么需要 ...
- 20165235实验四 Android程序设计
20165235实验四 Android程序设计 实验课程:JAVA编程设计 实验名称:Android开发 姓名:祁瑛 学号:20165235 实验时间:2018.05.16 指导老师:娄家鹏 Andr ...
- pythonclass,day1-day2.
由于是小白,真的一点点的基础都没有,所以压力确实有点大的.全程都是在碰壁,没有明白的地方,装个软件都问题层出不穷,别人几秒钟搞定的,我需要几十分钟,甚至更久...真的是,太强烈的挫败感了,整个人被乌云 ...