马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
- 在蓝桥杯当中,当数字很大的时间,我们就得相对应转化一下数字的表现情势
异或和之和
异或和之和
思绪分析:
- 由于数据的范围非常大,最大的数字是 2 20 2^{20} 220,以是得思量利用二进制的情势举行表现
- n = int(input())
- a = [int(x) for x in input().split()]
- ans = 0
- for k in range(21): # 所有a不超过20位
- zero, one = 1, 0 # 统计第k位的0和1的数量
- cnt, sum = 0, 0 #cnt用于统计第k位有多少对si⊕sj =1
- for i in range(n):
- v = (a[i] >> k) & 1 # 取a[i]的第k位
- sum ^= v # 对所有a[i]的第k位做异或得到sum,sum等于0或者1
- if sum == 0: # 前缀和为0
- zero += 1 # 0的数量加1
- cnt += one # 这次sum=0,这个sum跟前面等于1的sum异或得1
- else: # 前缀异或为1
- one += 1 # 1的数量加1
- cnt += zero # 这次sum=1,这个sum跟前面等于0的sum异或得1
- ans += cnt * (1 << k) # 第k位的异或和相加
- print(ans)
复制代码
- 增补一个通例做法,时间复杂度是 o ( n 2 ) o(n^2) o(n2)
- import os
- import sys
- # 请在此输入您的代码
- # 1,2,3,4,5
- # 异或和可以用这个前缀和的思想
- n = int(input())
- num = list(map(int,input().split()))
- pre = [0]*(n+1)
- for i in range(n):
- pre[i+1] = pre[i]^num[i]
- ans = 0
- for i in range(1,n+1):
- for j in range(i,n+1):
- tmp = pre[j] ^ pre[i-1]
- ans+=tmp
- print(ans)
复制代码 |