第一次做训练计划的时候没有做出来。。。回头又看了看, 就是个高中物理题。已知周期,求多长时间运行到一条线上。
已知每个行星的角速度为vi = 2*π/Ti,选择一个行星T0作为坐标系,则其他行星的相对速度为vi' = (T0 - Ti)*2π/(T0*Ti)。则角度绕过半个圆周的时间为Ti' = π/vi' = (T0*Ti)/((T0 - Ti)*2)
这样就是求所有Ti‘的分子的LCM和所有Ti’分母的GCD。
ps:注意两点,1、去掉周期相同的,2、用BigInteger。
View Code
import java.util.*;import java.io.*;import java.math.*;public class Main { final static int N = 1024; public static BigInteger[] fz = new BigInteger[N]; public static BigInteger[] fm = new BigInteger[N]; public static int[] t = new int[N]; public static int[] tt = new int[N]; public static int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); } public static void main(String[] args) { Scanner cin = new Scanner(System.in); int n, i, a, b, g; n = cin.nextInt(); for(i = 0; i< n; ++i) { t[i] = cin.nextInt(); } Arrays.sort(t, 0, n); int m = 0; tt[m++] = t[0]; for(i = 1; i < n; ++i) { if(t[i] != t[i-1]) tt[m++] = t[i]; } for(i = 1; i < m; ++i) { a = tt[i]*tt[0]; b = (tt[i] - tt[0])*2; g = gcd(a, b); fz[i] = BigInteger.valueOf(a/g); fm[i] = BigInteger.valueOf(b/g); } BigInteger t1 = fz[1], t2 = fm[1], gg, aa; for(i = 2; i < m; ++i) { aa = t1.multiply(fz[i]); gg = t1.gcd(fz[i]); t1 = aa.divide(gg); t2 = t2.gcd(fm[i]); } System.out.println(t1 + " " + t2); }}