POj-3101-Astronomy(分数GCD+BigInteger)

32 篇文章 0 订阅
7 篇文章 0 订阅

链接:http://poj.org/problem?id=3101


题意:给出每颗行星的运行周期,问多久运行到一条直线上


角速度为v = 2*π/T

以第一颗行星为参照点

则其他行星的相对速度为V' = (Ti- T0)*2π/(Ti*T0)

半个周期即可在同一条直线上

绕过半个圆周的时间为t = π/V' = (T0*Ti)/((T0 - Ti)*2) 


n-1个分数的GCD就是答案

gcd(x/y,a/b)=lcm(x,a)/gcd(y,b);


//package zzz;
import java.util.Arrays;
import java.util.Scanner;
import java.lang.reflect.Array;
import java.math.*;
import java.text.*;
public class Main {

	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner cin=new Scanner(System.in);
		int []a=new int[1010];
		int []b=new int[1010];
		int n;
		while(cin.hasNext())
		{
			n=cin.nextInt();
			for(int i=0; i<n; ++i)
				a[i]=cin.nextInt();
			Arrays.sort(a,0,n);
			int p=0;
			for(int i=0; i<n; ++i)
			{
				if(i==0)b[p++]=a[i];
				else if(a[i]!=a[i-1])b[p++]=a[i];
			}
			BigInteger son=null,mo=null;
			for(int i=1; i<p; ++i)
			{
				BigInteger x=BigInteger.valueOf(b[i]*b[0]);
				BigInteger y=BigInteger.valueOf((b[i]-b[0])*2);
				BigInteger ml=x.gcd(y);
				x=x.divide(ml);
				y=y.divide(ml);
				if(i==1)
				{
					son=x;
					mo=y;
				}
				else 
				{
					mo=mo.gcd(y);
					BigInteger g=son.gcd(x);
					son=son.multiply(x.divide(g));
				}
			}
			System.out.println(son+" "+mo);
		}
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值