题目的意思就是求和.
首先,一眼看出去就能想到一个o(n^2)的时间复杂度的代码,但是很明显不能这么写。
解题思路:
1.题目为异或运算,想到二进制。
2.先模拟一次可以运行的简单运算,比如题目所给的:1^2 + 1^3 + 2^3,我们将1^2+1^3拿出来因为这就是一个循环的运算,我们将其展开 001 ^ 010 + 001 ^ 011 = 5 ,很明显的如果我们继续进行这样的二进制运算,那我们将其变成二进制的效果就没有体现出来,所以我们进行下一步。
3. 我们将 1 2 3 的二进制分别写出来,就是 001 010 011 ,我们知道异或运算的规则,所以我们可以将每一个数字之间的异或展现成每一个数位之间的异或运算。例如:最低位为1的时候 ,只有其他的数出现0的时候才会对我们的结果产生影响。然后我们就找他后面的数在最低位上位0的数的个数,很显然是一个, 所以 这个最低位对结果的影响就是 1 * 1。 所以题目就变得十分的简单 我们只需要知道这个数的每一位数是1还是0 然后找他之后的数在这个数位上与他不同的数的个数的总和就行。
4.所以我们将题目转换完之后我们就是只要知道每一个数的每一个数位上是1还是0,以及这个数之后的所有数在每一个数位上的0的总和以及1的总和。这就是我们要解决的本题的问题,方法有很多,我用的是差不多前缀和的方法。
下面就是我的代码
#include<