0
点赞
收藏
分享

微信扫一扫

<笔试> 式子求值

木匠0819 2022-03-12 阅读 26

 

 

题目分析:

这个题目一开始拿到的时候以为很难,但是根据给出的例子,就能够理解题目意思。

 

 

我的代码只通过了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数组记录

举报

相关推荐

0 条评论