poj2429

来源:互联网 发布:c语言 时间戳转换函数 编辑:程序博客网 时间:2024/06/11 10:14

题目链接:http://poj.org/problem?id=2429

题意:给出a,b两个数的最小公倍数和最大公约数,求出a,b,并且a+b最小

解题思路:这题我没有想出什么简便的方法,只能用枚举的方法。在枚举之前,必须要进行一些预处理。首先,我们要知道的是:

a*b=GCD(a,b)*LCM(a,b);

GCD(a,b)=G,

GCD(a/G,b/G)=1,

LCM(a/G,b/G)=a/G*b/G=a*b/(G*G)=LCM(a,b)/G;

所以,要想枚举求出a,b。我们只需要求出a/G,b/G。要想a+b最小,只要a,b最接近就可以了。那个从sqrt(LCM(a,b)/G),枚举就可以了。

import java.util.Scanner;import java.math.*;public class Main{public static void main(String[] args){Scanner cin = new Scanner(System.in);long a, b, x, y;while(cin.hasNext()){a = cin.nextLong();b = cin.nextLong();x = y = 0;b /= a;for(long i = (long)Math.sqrt(b); i > 0; i --){if(b%i == 0&&gcd(i, b/i) == 1){x = i*a; y = b/i*a; break;}}System.out.println(x+" "+y);}}public static long gcd(long a, long b){if(a<b){long t =a; a = b; b = t;}if(b == 0) return a;else return gcd(b, a%b);}}


0 0
原创粉丝点击