【AtCoder】AGC001 Mysterious Light

版权声明:本文为博主原创文章,不管你喜不喜欢都请在注明作者后转载~( ̄▽ ̄~) https://blog.csdn.net/C20190102/article/details/82927067

题目

传送门

题目大意

在一个边长为 N N 的等边三角形中,你按如图所示(距 a a X X 单位长的位置)的方法发射一道激光,激光遇到三角形的边或者之前的激光都会反弹,激光回到原点就结束,问一共走了多远。
图示

思路

图示1
在平行四边形 D E F B DEFB 中,激光由 F F 开始反射,能够“完整”地反射到 H H ,然后进入平行四边形 D E H G DEHG
在平行四边形 D E H G DEHG 中,激光由 H H 开始反射,能够“完整”地反射到 D D ,发现反射完成。

于是递归求解。
f ( a , b ) f(a,b) 表示在边长为 a , b a,b 的平行四边形中激光一共走过的距离,则答案为(加上最开始两个轨迹的长度) f ( x , N x ) + N f(x,N-x)+N
如上图,在平行四边形 D E F B DEFB 中, a = D E , b = E F a=DE,b=EF ,所以激光完整走过的距离是 F H × 2 = a b × 2 FH\times2=\lfloor\dfrac{a}{b}\rfloor\times2
然后激光进入平行四边形 D E H G DEHG ,在平行四边形 D E H G DEHG 中, a = E H = b % a , b = D E = 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)

边界很简单,当 b b a a 的倍数时,说明激光能够回到原点,返回 a b × 2 a \lfloor\dfrac{a}{b}\rfloor\times2-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));
}

猜你喜欢

转载自blog.csdn.net/C20190102/article/details/82927067