Astronomy
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()); }