BUAA_ALGORITHM HW01


定义整数 i 的“3 余因子”为 i 最大的无法被 3 整除的因子,记作 md3(i)md3(i),例如 md3(3)=1,md3(18)=2,md3(4)=4md3(3) = 1, md3(18) = 2, md3(4) = 4。请你设计一个高效算法,计算一个正整数区间 [A,B],(0<A<B)[A, B],(0 < A < B) 内所有数的“3 余因子”之和,即 i=ABmd3(i)\sum^{B}_{i=A} md3(i),并分析该算法的时间复杂度。例如,区间 [3,6][3, 6]的计算结果为 1+4+5+2=121 + 4 + 5 + 2 = 12

这个题我做的不好,我原来的解法是暴力解法,时间复杂度较高。

真正巧妙的办法是使用分治法。区间 [A,B][A, B] 中每一个数的“3余因子”显然是相互独立的,因此 i=ABmd3(i)=i=1Bmd3(i)i=1A1md3(i)\sum^{B}_{i=A} md3(i) = \sum^{B}_{i=1} md3(i) − \sum^{A−1}_{i=1} md3(i),原问题被简化为考虑如何对于非负整数 NN,求解 i=1Nmd3(i)\sum^{N}_{i=1} md3(i)

NN00 时,这个式子是没有意义的所以答案直接取 00。首先考虑区间中无法被 33 整除的数字,例如对 33 取模为 11 或者 22 的数,这些数满足 md3(i)=imd3(i) = i,所以可以直接利用等差数列的公式求解。

然后考虑区间 [1,N][1, N]33 的倍数,因为区间是从 11 为起点连续不断的,所以 [1,N][1, N]33 的倍数一定可以写为 [31,32,,3N3][3 ∗ 1, 3 ∗ 2, \cdots , 3 ∗ \lfloor \frac{N}{3}\rfloor] 因子 33 都不能被算上,所以相当于求区间 [1,N3][1, \lfloor\frac{N}{3}\rfloor] 中的“3 余因子和”,那么原问题被转化为了一个规模只有原来 1/3 的问题,可以使用分治法。

33 取模为 1122 的数字 ii 直接计算 md3(i)md3(i) 的时候,可以选择分类讨论,也可选择直接计算,减取正好被 33 整除的数的和。

图 1

相关资源:


Author: Yixiang Zhang
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Yixiang Zhang !
评论
  TOC