题目描述
给定两个不同的正整数 a , b求一个正整数 k使得 gcd ( a + k , b + k ) 尽可能大,其中 gcd ( a , b )表示 a 和 b 的最大公约数,如果存在多个 k,请输出所有满足条件的 k中最小的那个
输入格式
输入一行包含两个正整数 a , b用一个空格分隔。
输出格式
输出一行包含一个正整数 k。
样例输入
5 7
样例输出
1
测评和数据规模
思路
根据性质:若a>=b,有gcd ( a , b ) = gcd ( a - b , b ) = gcd ( a , a - b )
gcd(12,8) = 4
gcd(12-8,8) = gcd(4,8) = 4
gcd(12,12-8) = gcd(12,4) = 4
同理,将a+k 、b+k 代入gcd ( a , b ) 可得 gcd ( a+k , b+k ) = gcd ( a - b , b+k ) = gcd ( a+k , a - b )
此时目标:“使gcd ( a+k , b+k )最大”转化为“使 gcd ( a - b , b+k )或gcd ( a+k , a - b )最大”,要使后者gcd最大,很显然这个gcd的最大值肯定是a-b (a>b)。因此题目意思变为:求使得 (a+k) % (a-b) ==0 的最小k值
如何求?
求使gcd(13+k,3)的值为3的k
即求使得 (13+k)%3==0 的第一个k(最小k)
令tmp=13/3=4 (int)
3*(tmp+1)=3*(4+1)=15
则13+k=15 ,即k=2
AC代码
import java.util.Scanner;
public class G_GCD {
static long a,b;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
a=sc.nextLong();
b=sc.nextLong();
if(a<b) swap();
long c=a-b;
long k=1; //题目说k是正整数 即 k>=1
if(a%c==0) {
System.out.println(k);
}else {
long d=a/c;
k=c*(d+1)-a;
System.out.println(k);
}
}
public static void swap() {
long tmp;
tmp=a;
a=b;
b=tmp;
}
}
今日创作在听:美人鱼