1、已知每个行星的角速度为wi= 2*π/Ti
选择一个行星T0作为坐标系,则其他行星的相对速度为wi' = wi-w0;
则角度绕过半个圆周的时间为Ti' = π/wi' = (T0*Ti)/( (T0 - Ti)*2 ),如果要求两行星在一条直线上的最短时间,必然满足该公式
2、要求多个分数的最小公倍数,得到的分数的分子必须是所有分母的最小公倍数,得到的分母是所有分子的最大公约数。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stdlib.h>
#define N 10001
using namespace std;
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
int c[N],r[N],index=1229,num[1230];
void table ()
{
int i,n,k=0,m;
for (n=2;n<=10000;n++)
{
m=1;
for (i=2; i * i <= n;++i)
if (n%i == 0)
{m=0;break;}
if (m)
num[k++]=n;
}
}
bool work()
{
int n,a,allgcd=0,i,b,j,k,len=0;
if(scanf("%d",&n)==-1)
return false;
scanf("%d",&a);
for(i=1;i<n;i++)
{
scanf("%d",&b);
if(a==b) continue;
int mul=a*b,sub=abs(a-b),g=gcd(mul,sub);
mul/=g;
sub/=g;
allgcd=gcd(sub,allgcd);
for(j=0;j<index && mul>1;j++)
{
k=0;
while(mul%num[j]==0)
{
mul/=num[j];
k++;
}
c[j]=max(c[j],k);
}
}
if(c[0])
c[0]--;
else
allgcd*=2;
r[0]=1;
for(i=0;i<index;i++)
for(j=0;j<c[i];j++)
{
int temp=0;
for(int k=0;k<=len;k++)
{
r[k]=r[k]*num[i]+temp;
temp=r[k]/10000;
r[k]%=10000;
if(temp && k==len)
len++;
}
}
printf("%d",r[len--]);
for(;len>=0;len--)
printf("%04d",r[len]);
printf(" %d\n",allgcd);
return true;
}
int main()
{
table();
while(work());
}