题目描述
求最小的 $k$,使得 $gcd(a+k,b+k)$ 的值最大。
$1\le a\lt b\le 10^{18}$。
算法分析
数论忘光了,思博选手不会写数学题。。。
首先有 $gcd(a,b)=gcd(b,a-b)$,很好理解:$a=gc$,$b=gd$ 的话 $a-b=g(c-d)$ 依然是两者最大公约数的倍数,这就是辗转相除法的基础。
那么,有 $gcd(a+k,b+k)=gcd(a-b,a+k)$ 且 $gcd(a+k,b+k)=gcd(a-b,b+k)$,一定能构造出 $g=a-b$ 的解,取 $a-b|a+k$ 和 $a-b|b+k$ 中最小的 $k$ 即可。
代码实现
1 | import java.util.Scanner; |