这里写自定义目录标题
更多精彩内容
这里是带你游历编程世界的Dashcoding编程社,我是Dash/北航硕士/ICPC区域赛全国排名30+/给你呈现我们眼中的世界!
256题算法特训课,帮你斩获大厂60W年薪offer
原题
腾讯校招真题最大公约数
B站动画详解
问题分析
这道题的核心在于通过有限的 k k k 次操作,最大化两个整数 a a a 和 b b b 的最大公约数 (GCD, Greatest Common Divisor)。具体来说,问题要求每次可以将 a a a 或 b b b 增加1,然后问在进行 k k k 次操作后,如何使 a a a 和 b b b 的 GCD 最大。GCD 的性质决定了当两个数之间差距越小且有更多的公共因子时,GCD 越大。因此,最优策略是通过调整 a a a 和 b b b 的值来找到差距最小且GCD最大的情况。
在实际操作中,可以枚举每一种可能的操作组合,即 a + i a + i a+i 和 b + ( k − i ) b + (k - i) b+(k−i),其中 i i i 代表对 a a a 进行的自增次数, k − i k - i k−i 代表对 b b b 进行的自增次数。对每种组合计算 GCD 并取最大值即为所求。
为了优化计算过程,可以利用欧几里得算法快速计算两个数的 GCD,从而确保在枚举所有可能操作组合时,效率仍然较高。
思路分析
这道题的解法主要依赖枚举优化和GCD的性质。具体实现思路如下:
- 枚举 i i i 的取值范围从 0 0 0 到 k k k,表示对 a a a 进行了 i i i 次自增。
- 对于每个 i i i,计算 a + i a + i a+i 和 b + ( k − i ) b + (k - i) b+(k−i) 的 GCD。
- 在所有枚举的结果中,取最大的 GCD 即为答案。
这个算法的核心是利用了GCD的性质,以及对 k k k 次操作进行枚举。尽管最坏情况下需要枚举 k + 1 k + 1 k+1 种情况,但由于 k k k 的最大值为 100 , 000 100,000 100,000,而 GCD 的计算效率很高 (时间复杂度为 O ( log ( min ( a , b ) ) ) O(\log(\min(a, b))) O(log(min(a,b)))),因此整体算法在常数因子较低的情况下仍然可以通过。
算法的时间复杂度为 O ( T × k × log ( min