题解:P12174 [蓝桥杯 2025 省 Python B] A · B Problem
CSP_S_2023_T2 · · 题解
思路
Step 1:
对于
先枚举所有可能的
时间复杂度
Step 2:
我们定义
如
显然答案为
也就是
不懂的可以自己手推一下。
所以,我们可以预处理出所有的
此时 C++ 已经能过了,但是 Python 还不能。
Step 3:
考虑对预处理进行优化。
我们发现,在预处理的过程中,寻找
所以,我们不妨枚举所有因数,即先从
容易发现时间复杂度即为调和级数(不懂的自己百度),也就是
此时 Python 也能过了。
于是这道题就做完了。
代码
n=int(input())
ans=0
a=[0]*1048577 #1048577=2^20+1
b=[0]*1048577
for i in range(1,n+1):
for j in range(i,n+1,i):
a[j]=a[j]+1 #计数器 +1
for i in range(1,n+1):
b[i]=b[i-1]+a[i] #前缀和数组
for i in range(1,n+1):
ans=ans+a[i]*b[n-i] #统计答案
print(ans)
(疯狂暗示)