倍数分配法思路(Onlogn):
我们按 j 枚举 1~n,把 a[j] 加到所有 j 的倍数上:
j = 1 → i=1,2,3,4,5,6 加 a[1]=10
j = 2 → i=2,4,6 加 a[2]=24
j = 3 → i=3,6 加 a[3]=45
j = 4 → i=4 加 a[4]=73
j = 5 → i=5 加 a[5]=108
j = 6 → i=6 加 a[6]=150
代码如下(py):
n,a1,m=map(int,input().split())
a=[0,a1];b=[0]*(n+1)
for i in range(2,n+1):
a.append((a[i-1]+7*i)%m);
for i in range(1,n+1):
for j in range(i,n+1,i):
b[j]+=a[i]
ans=b[1]
for i in range(2,n+1):
ans^=b[i]
print(ans)

京公网安备 11010502036488号