poj 3101 Astronomy(分数的最小公倍数)
大致题意:求n个运动周期不全然同样的天体在一条直线上的周期。
这题我是看解题报告写的,没想到选用參照物,用到了物理中的角速度什么的。
由于n个天体的周期已知,那么它们的角速度为vi = 2*pi/Ti,若统一选第0个天体为參照物,那么其余天体的相对速度vi' =
2*pi*(T0-Ti)/(T0*Ti)(把周期T同样的天体合为一个天体)。则与第0个天体角度相差180度的时间为ti = (T0*Ti)/((T0-Ti)*2)。
那么求得全部ti的最小公倍数就是答案。
最终到重点了。ti作为分数,它们的最小公倍数定义为 : 全部分子的最小公倍数/全部分母的最大公约数数。
因为N太大,须要用大数处理。
又各种百度java。最终A啦。 两点了,洗洗睡吧。
import java.math.*; import java.util.*; import java.io.*; public class Main { public static int [] t = new int [1200]; public static int [] tt = new int [1200]; public static BigInteger [] fz = new BigInteger [1200]; public static BigInteger [] fm = new BigInteger [1200]; public static int gcd(int a, int b){ if(b == 0) return a; return gcd(b,a%b); } public static void main(String[] args) { int n,m; Scanner cin = new Scanner(System.in); n = cin.nextInt(); for(int i = 0; i < n; i++) t[i] = cin.nextInt(); Arrays.sort(t,0,n); //java中对数组的排序方法 m = 0; tt[m++] = t[0]; for(int i = 1; i < n; i++){ //把周期同样的缩点 if(t[i] != t[i-1]){ tt[m++] = t[i]; } } for(int i = 1; i < m; i++){ int a = tt[i] * tt[0]; int b = 2*(tt[i] - tt[0]); int g = gcd(a,b); fz[i] = BigInteger.valueOf(a/g); fm[i] = BigInteger.valueOf(b/g); } BigInteger t1 = fz[1],t2 = fm[1]; for(int i = 2; i < m; i++){ BigInteger aa = t1.multiply(fz[i]); BigInteger gg = t1.gcd(fz[i]); t1 = aa.divide(gg); t2 = t2.gcd(fm[i]); } System.out.println(t1 + " " + t2); } }