https://www.hackerrank.com/challenges/xor-quadruples/problem
https://www.hackerrank.com/challenges/xor-quadruples/editorial
关键点:
1. 把4个数拆成2组,预先计算,而且预先计算是小于x的区间范围(遍历后面那组的时候就会发现要这样才能做到O(NN))
2. 异或有范围,最大4096
3. 先排序,不懂为什么,有人说:order doesn't matter. If you sort a,b,c,d then you can eliminate the need to check for permutations
def beautifulQuadruples(a, b, c, d):
res=0
total_=[0]*(1+b)
for i in range(1,b+1): total_[i]=min(i,a)
total=[0]*(1+b)
for i in range(1,b+1): total[i]=total[i-1]+total_[i]
for i in range(1,c+1): res+=total[min(i,b)]*max(0,d-i+1)
# print(res)
cnt_=[[0 for _ in range(4097)] for _ in range(1+b)]
for i in range(1,a+1):
for j in range(i,b+1):
cnt_[j][i^j]+=1
cnt=[[0 for _ in range(4097)] for _ in range(1+b)]
for j in range(4097):
for i in range(1,1+b):
cnt[i][j]=cnt[i-1][j]+cnt_[i][j]
for i in range(1,c+1):
for j in range(i,d+1):
res-=cnt[min(i,b)][i^j]
return res
if __name__ == '__main__':
abcd = list(map(int,input().strip().split(' ')))
abcd.sort()
a = int(abcd[0])
b = int(abcd[1])
c = int(abcd[2])
d = int(abcd[3])
result = beautifulQuadruples(a, b, c, d)
print(result)