题目分析:
这个题目一开始拿到的时候以为很难,但是根据给出的例子,就能够理解题目意思。
我的代码只通过了4条,超出时间复杂度:
# 输入
n=int(input())
a=list(map(int,input().split()))
# 初始化
ans=0
t=0
tmp=[0]*(n+1)
# 得到输入数字的异或值 a1-an的异或值
for i in range(n):
ans=ans^a[i]
# 得到剩下部分的异或值
# 用tmp记录需要异或的数字
for i in range(1,n+1):
rest=n%(i*2)
while rest>0:
# 大于一个轮回
if rest>=i:
for j in range(1,i):
tmp[j]=tmp[j]+1
rest=rest-i
# 不够一个轮回
else:
for j in range(1,rest+1):
l=j%i
tmp[l]=tmp[l]+1
rest=0
# 如果数量是偶数就抵消,是奇数才进行异或
for i in range(len(tmp)):
if tmp[i]%2==1:
t=t^i
print(ans^t)
动态规划题解思路一样,时间复杂度符合要求:
n=int(input())
arr=list(map(int,input().split()))
a=0
dp=[0]*(n+1)
x=0
for i in range(n):
a=a^arr[i] # 算所有输入的数字的异或值
dp[i+1]=dp[i]^(i+1) # 用来记录0-n的累积异或值
if (n//(i+1))%2==0: # 如果这一列是循环数字数量的偶数倍 相当于异或0 抵消了
pass
else: # 如果这一列是循环数字的奇数倍 说明抵消后还有数字多余了
x^=dp[i] # 从0-i的异或值(一个循环)
x^=dp[n%(i+1)] # 循环后剩下的数字的异或值
print(a^x)
总结:
涉及到反复计算1-n的时候,例如n的阶乘,可以使用dp数组记录