题目
题目大意
在一个边长为
N
N
N的等边三角形中,你按如图所示(距
a
a
a点
X
X
X单位长的位置)的方法发射一道激光,激光遇到三角形的边或者之前的激光都会反弹,激光回到原点就结束,问一共走了多远。
思路
在平行四边形
D
E
F
B
DEFB
DEFB中,激光由
F
F
F开始反射,能够“完整”地反射到
H
H
H,然后进入平行四边形
D
E
H
G
DEHG
DEHG。
在平行四边形
D
E
H
G
DEHG
DEHG中,激光由
H
H
H开始反射,能够“完整”地反射到
D
D
D,发现反射完成。
于是递归求解。
设
f
(
a
,
b
)
f(a,b)
f(a,b)表示在边长为
a
,
b
a,b
a,b的平行四边形中激光一共走过的距离,则答案为(加上最开始两个轨迹的长度)
f
(
x
,
N
−
x
)
+
N
f(x,N-x)+N
f(x,N−x)+N
如上图,在平行四边形
D
E
F
B
DEFB
DEFB中,
a
=
D
E
,
b
=
E
F
a=DE,b=EF
a=DE,b=EF,所以激光完整走过的距离是
F
H
×
2
=
⌊
a
b
⌋
×
2
FH\times2=\lfloor\dfrac{a}{b}\rfloor\times2
FH×2=⌊ba⌋×2。
然后激光进入平行四边形
D
E
H
G
DEHG
DEHG,在平行四边形
D
E
H
G
DEHG
DEHG中,
a
′
=
E
H
=
b
%
a
,
b
′
=
D
E
=
a
a'=EH=b\%a,b'=DE=a
a′=EH=b%a,b′=DE=a。
于是: f ( a , b ) = ⌊ a b ⌋ × 2 + f ( b % a , a ) f(a,b)=\lfloor\dfrac{a}{b}\rfloor\times2+f(b\%a,a) f(a,b)=⌊ba⌋×2+f(b%a,a)
边界很简单,当 b b b是 a a a的倍数时,说明激光能够回到原点,返回 ⌊ a b ⌋ × 2 − a \lfloor\dfrac{a}{b}\rfloor\times2-a ⌊ba⌋×2−a,注意要减掉一个 a a a(观察样例)。
注意开long long
。
代码
#include<cstdio>
long long Solve(long long a,long long b){
if(b%a==0)
return b/a*a*2-a;
return b/a*a*2+Solve(b%a,a);
}
int main(){
long long N,X;
scanf("%lld%lld",&N,&X);
printf("%lld",N+Solve(X,N-X));
}