题目传送门
UPD2:这道题题解已经半残,请结合这里的研究食用。
2017.9.15 水 UOJ 裙的时候 onepointo 童鞋说这道题没人水……于是看了看……
其实就是求一个椭圆与给定圆外切的切点坐标,这个椭圆不是标准椭圆(即主轴为
x
x
x 轴)。
如果我们暴力列方程的话有如下几个方程:
切点在圆上;
切点在椭圆上;
该点处圆的切线与椭圆的切线相同。
按理说是可求的,可是切点未知,解方程很难……
问题出在并不知道切点(也不会求切线……),观察到精度要求很低,可以想到等分圆周,判断每个点为切点的情况。
怎么判断切点……不是切线不会求吗……
观察到如果该点为切点,形成的椭圆长轴长应该是最短的,类比一下两个圆的位置关系可以理解到这一点。
然后就有判断依据咯……等分圆周然后找一个
a
a
a 最小的点就是答案……
那天晚上A了……可是出题人认为暴力太简单加强了数据……等分圆周就T了(其实是WA?)
于是改进这个等分圆周的策略……
出题人:这个距离函数长得跟正弦函数差不多
???蛤?
证明:感性理解
???蛤?
这样的话爬山就可以了……复杂度玄学
可是模拟退火不仅比爬山慢而且精度比爬山低得多……不知道为什么……
纪念写的第一份爬山,并写出了倒数的速度……(感谢Claris……(大雾))
UPD:退役之后想了想,还是感觉证明很麻烦。
下面说说成果吧……劳资推了两个晚自习了QAQ
先转化一下坐标系,让原点位于两焦点中点,两焦点连线位于
x
x
x 轴上,这个可以通过坐标变换公式来完成,计算完成之后再移回去即可。
下面是坐标变换公式:
设平面直角坐标系
O
x
y
,
O
′
x
′
y
′
Oxy,O'x'y'
Oxy,O′x′y′,
O
′
\mathrm{O'}
O′ 点在
O
x
y
Oxy
Oxy 坐标系下坐标为
(
x
0
,
y
0
)
(x_0,y_0)
(x0,y0),由
x
x
x 轴转到
x
′
x'
x′ 轴转过角度为
θ
\theta
θ。
M
\mathrm{M}
M 点在
O
x
y
Oxy
Oxy 坐标系下坐标为
(
x
,
y
)
(x,y)
(x,y),在
O
′
x
′
y
′
O'x'y'
O′x′y′ 坐标系下坐标为
(
x
′
,
y
′
)
(x',y')
(x′,y′),则满足关系:
{
x
′
=
x
cos
θ
+
y
sin
θ
−
x
0
y
′
=
y
cos
θ
−
x
sin
θ
−
y
0
\begin{cases} x'=x\cos \theta+y\sin \theta -x_0&\\ y'=y\cos \theta-x\sin\theta-y_0 \end{cases}
{x′=xcosθ+ysinθ−x0y′=ycosθ−xsinθ−y0
这样就可以得到一个标准椭圆了。
联立:
{
b
2
x
2
+
a
2
y
2
=
a
2
b
2
(
x
−
m
)
2
+
(
y
−
n
)
2
=
r
2
\begin{cases} b^2x^2+a^2y^2=a^2b^2&\\ (x-m)^2+(y-n)^2=r^2 \end{cases}
{b2x2+a2y2=a2b2(x−m)2+(y−n)2=r2
于是得到了一个非常复杂的一元四次方程,注意不要将
y
2
y^2
y2 开根号,需要讨论正负,正确的方法是移项并将其平方。
然后根据盛金公式,令这个方程有四重根就好了。
没算,留坑不补了(真的太恶心了……)
换种方法?
椭圆上一点的切线可以这样作:令
P
\mathrm{P}
P 为椭圆上一点,分别连接该点与左右焦点
F
1
,
F
2
\mathrm{F_1},\mathrm{F_2}
F1,F2,则
∠
F
1
P
F
2
\angle \mathrm{F_1PF_2}
∠F1PF2 的角分线的垂线为
P
\mathrm{P}
P 点处切线。
也就是说,圆心与
P
\mathrm{P}
P 点连线所在直线平分
∠
F
1
P
F
2
\angle \mathrm{F_1PF_2}
∠F1PF2。不过这个还得等分圆周……
没什么好做法了,不如上知乎问个问题QAQ。
Code