[POJ 3101]

Astronomy

分类里写的是扩展欧几里德,但完全用不到。倒是被高精度稍微卡了下。

题意是共有n个星体各以vi的速度绕同一中心公转,问所有星体排成一条直线的周期。

这里注意“排成一条直线”,可以是在圆周的一侧或是另一侧。这里可以取速度最快的星作为运动参照物,求其他星体相对该星的速度,并计算各星体(v0-vi)*x可同时被0.5除尽的最小倍数值x。x即为所求周期值。0.5是因为可在圆周的任意一侧。

用题意vi = 1/ti来表示的话,则1/t0 – 1/ti = (ti-t0) / (t0*ti),那么取所有分母的lcm为nu,所有分子的gcd为de,则nu/(2*de)则是所求的x了。

思路出来之后,还有部分细节,首先就是去重,然后是计算素数表大小和估计高精度数组最大长度,最后每次求出某分数值时要约分到最简。这里所谓的“高精度”比较有意思的是,用质因数分解的方式保存各个值,这样可非常简便地求gcd和lcm。