题目大意

有\(T\)组数据,每组数据给定两个\(l,n\in\mathbb{N*}\),构造一个长为\(l\),每个元素不超过\(n\)的数组

令他为\(a\),要使

\[\sum_{i=1}^l\sum_{j=1}^{i-1}a_i\oplus a_j
\]

最大,问最大值为多少

浅浅谈一下?

  • 首先,我们肯定从那个式子入手,我们可以发现\(\sum_{i=1}^l\sum_{j=1}^{i-1}\)这个东西,就是让一个数组里的每两个元素一一异或

  • 于是,问题就转变成了你需要构造一个\(a\)数组,里面的每两个元素一一异或的值加起来最大

  • 我们继续转化,发现异或就是把每个数变成二进制,进行运算的,所以我们就可以想象有一堆二进制数,他们现在要一一异或

  • 我们来认识一下异或:\(\oplus\)

  • 运算规则

  • 只要不一样就是\(1\),不一样就是\(0\)

  • 例子:\(01_{(2)} \oplus 11_{(2)}=10_{(2)}\)

  • 发现了什么?

  • 只有两边各有一个\(0\)或\(1\)这一位才为\(1\)

  • 我们再来认识一下位值

  • 假设有一个\(101_{(2)}\),它的十进制是什么?

  • 是不是\(4+1=5\)?所以第三位\(1\)它的值就是\(2^{3-1}=4\)

  • 我们归纳一下,如果一个二进制数,它的第\(k\)位是1,那么那一位贡献的值就是\(2^{k-1}\)

  • 好啦,以上就是前置芝士

回到本题

  • 既然我们吧那个式子转换成一堆二进制一一异或,我们就可以每一位每一位的看

  • 假如现在有\(l\)个二进制数,我们单独看看第\(k\)位

  • 假设第\(k\)位有\(x\)个\(0\).那么第\(k\)位就有\(l-x\)个\(1\)

  • 现在我们要看看这一堆\(0\)和\(1\)对原式有什么贡献

  • 根据前置芝士,只有一个\(0\)和一个\(1\)才能有一个\(1\)

  • 所以第\(1\)个\(0\)可以和其他\(l-x\)个\(1\)一一异或成为\(l-x\)个\(1\)

  • 同理,第\(2\)个,第\(3\)个……都可以产生\(l-x\)个\(1\)

  • 所以共可以产生\(x\cdot (l-x)\)个\(1\),而第\(k\)个\(1\)贡献的值为\(2^{k-1}\),所以总共贡献的值为

  • \(2^{k-1}\cdot x \cdot (l-x)\)

  • 所以,如果我们设\(p\)为\(n\)的二进制位数的话

\[\sum_{i=1}^l\sum_{j=1}^{i-1}a_i\oplus a_j=\sum_{i=1}^p2^{i-1}\cdot x \cdot (l-x)
\]
  • 要使那个式子最大,首先要使\(2^{i-1}\cdot x \cdot (l-x)\)这个最大

  • 我们发现\(2^{i-1}\)是常数,不看他,也就是要\(x\cdot (l-x)\)最大

  • 假如你学过二次函数

\[x\cdot (l-x)=-x^2+lx
\]
  • 该二次函数开口向下,有最大值

  • 也就是当\(x=-\frac{b}{2a}=\frac{-l}{-2}=\frac{l}{2}\)时取最大值

  • 这里要纠正一下,因为只有可能是整数,所以我们这里向下取整一下(和向上取整没区别)

  • 原式就等于\(\left \lfloor \frac{l}{2}\right \rfloor\cdot (l-\left \lfloor \frac{l}{2}\right \rfloor)\)

  • 于是我们就可以得到一个式子(注意,\(\sum\)具有结合律)

\[

\begin{aligned}
&\sum_{i=1}^p2^{i-1}\cdot\left \lfloor \frac{l}{2}\right \rfloor\cdot (l-\left \lfloor \frac{l}{2}\right \rfloor)\\
=&\left \lfloor \frac{l}{2}\right \rfloor\cdot (l-\left \lfloor \frac{l}{2}\right \rfloor)\cdot\sum_{i=1}^p2^{i-1}
\end{aligned}
\]

  • 对于\(\sum_{i=1}^p2^{i-1}\)我们可以用等比数列的求和公式,它就变成了\(2^p-1\)
  • 所以我们要求的就是
\[\left \lfloor \frac{l}{2}\right \rfloor\cdot (l-\left \lfloor \frac{l}{2}\right \rfloor)\cdot2^{p}-1
\]
  • 最后一个问题:\(p\)是什么?
  • 我们立刻就会想到与\(\log n\)有关系,我们来手摸一下
  • 如果是\(8=1000_{(2)}\),\(\log 8=3\),位数是\(4\),所以我们要加一
  • 再来一个\(7=111_{2}\),\(\log 7 = 2....\),位数是\(3\),所以我们要向下取整在加一
  • 归纳一下
\[p= \left \lfloor \log n\right \rfloor + 1
\]
  • 于是代码就出来了

\(\mathcal{Code}\)

#include<bits/stdc++.h>

using namespace std;
#define int unsigned long long
const int MAXN = 5e5 + 7, mod = 1e9 + 7; int T, n, l; signed main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0); cin >> T;
while (T--) {
cin >> n >> l;
if (n == 1) cout << 0 << endl;
else cout << ((l / 2 * (l - l / 2)) % mod * ((int)pow(2, (int)log2(n) + 1) - 1)) % mod << endl;
}
return kkksc03;
}

完结撒花✿✿ヽ(°▽°)ノ✿

最新文章

  1. Java 相关书籍
  2. JVM实用参数(八)GC日志
  3. Linux 启动过程分析
  4. Windows Phone &amp; Windows App应用程序崩溃crash信息抓取方法
  5. [Nginx 1] Nginx简介
  6. 随机变量的方差variance &amp; 随机向量的协方差矩阵covariance matrix
  7. leetcode-WordLadder
  8. Java枚举7常见种用法
  9. bootstrap 模态框动态加载数据
  10. listview去掉条目间的分割线
  11. 基于jquery 封装的 select 小控件,解决 IE6 7 8里 select 边框 高度 无法遮挡等问题
  12. Swift三元条件运算
  13. GIT命令一页纸
  14. 使用git把本地目录传到远程仓库
  15. CentOS7 使用systemctl来管理服务
  16. 《C#从现象到本质》读书笔记(八)第10章反射
  17. HTML(具体代码看笔记本)
  18. INNODB索引与算法
  19. Live Archive 训练题 2019/3/9
  20. jquery做简单特效

热门文章

  1. 自己动手写线程池——向JDK线程池进发
  2. .NET 6学习笔记(4)——如何在.NET 6的Desktop App中使用Windows Runtime API
  3. python django超链接
  4. [Pyhton] SimPy 离散事件模拟框架详解 —— 以一个简单的汽车充电排队模拟为例
  5. Excel常用需求
  6. Go语言核心36讲09
  7. Java-ArrayList常用方法
  8. sqlserver数据库还原
  9. 小程序canvas2D绘制印章,话不多说,直接上代码
  10. integer 拆箱装箱以及范围