主题目
22 - 27 题
整体解析:
solve2可以比较简单的模拟,但是一时看不出来含义,solve1的算法类似筛法,p表示是否质数,k是i的幂次数组,f存的是最小质因数,g存的是满足最小质因数的最高幂次的因数。
f[i]= f[i / g[i]]*(g[i]* f[i]- 1)/(f[i]- 1); 是最难理解的一句。
首先 f[i/g[i]],因为i/g[i]<i,所以这个f[i/g[i]] 已经是经过计算的新的值。类似动态规划中数组的复用。
(g[i]*f[i]-1)/(f[i]-1),有点像等比数列求和公式,实际上求的是1,f[i],f[i]*f[i],...,g[i]这个数列的和。
如果能联想到求一个数的约数和的公式,可以理解完整的一行,实际上是在求i的所有约数和。sum是1-n的约数和的和。
28 - 33题
整体解析:
读f函数可知,f0中的a数组是从小到大排序的,a[j]<a[i]-m,j是小于a[i]-m的最后一个位置(或者0),所以s是计算序列a中差值不超过m的数对的个数。
f0判断满足这个条件的数对个数是否>=k。本题需要看懂题目才方便做题。
f函数是一个二分查找,g=0,h=a.back()-a[0],分别是条件最紧和条件最宽松,返回值是最小的x,满足a中差值不超过x的数对个数>=k。