POJ 3101 Astronomy (角速度啊,高中物理啊。。。T_T)

  第一次做训练计划的时候没有做出来。。。回头又看了看, 就是个高中物理题。已知周期,求多长时间运行到一条线上。

已知每个行星的角速度为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);
    }
}

 

posted @ 2012-10-30 09:26  AC_Von  阅读(891)  评论(0编辑  收藏  举报