Intel Code Challenge Final Round C.Ray Tracing

C.Ray Tracing


题意:在n*m的空间内,一个小球从(0,0)以固定的速度2 ,并且以斜45°的角度出发.若碰到空间边界则反弹.若碰到空间四个角落的点则停止.给你k个点,问到达该点所需时间,若到达不了,则输出-1.


思路:
1. 按照给出的样例模拟走几遍,可以发现结束的时间为lcm(n,m) .
2. 希望将这些折线放在y=x 这条直线上,就可以方便计算某点时间.那么就可以考虑怎么样找出该点在y=x 上的点.

  • 任意点(x,y) ,设在直线y=x 上的点为(x,y) .
  • xxmod(2n) ,yymod(2m)
  • 即转化成线性方程组2nX+2mY=yx
  • 用扩展gcd求解
  • 假设点(x,y) 是第一次反弹后那条折线上的点,那么它在y=x 上的点为(2nx,y)(x,2my) .
  • 若是两次反弹后那条折线上的点,那么它在y=x 上的点为(2nx,2my) .
  • 若点(x,y) 中x=y,那么它就在直线y=x 上.
  • 不确定该点是几次弹射后,就对这四个点都进行一次方程求解,取最小值.

This Code

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章