codeforces724C. Ray Tracing(扩展欧几里得详解)

传送门:C. Ray Tracing
题意:一个矩形内有k个点,t=0从原点45度射出一束光线,遇到矩形的边就折射(入射角等于出射角),遇到顶点就停止,每秒前进根二单位长度,问矩形内的点第一次遇到光线是第几秒。
解法:首先把矩形展开成一个无边界平面,这时我们可以发现当x==y==n*m/gcd(n,m)时光线停止,设原坐标为a,b,则当展开后横坐标为a,2*n±a……2*x*n±a。同理纵坐标为2*y*m±b(这一点自己画图扩展一下便知)。因为光线45度角射出去,可知当横坐标等于纵坐标
即2*x*n±a ==2*y*m±b(x、y<n*m/gcd(n,m))的时候点会受到光照。因为是第一次遇到这里的x、y应为最小。即所求问题转化成2*x*n±a==2*y*m±b,即2*x*n - 2*y*m == ±(a ± b),使2*x*n和2*y*m最小,即求使等式成立的最小x,y。
就可以转化成典型的扩展欧几里得算法可以解决的问题ax+by=c,已知a和b,求使等式成立的x,y(整数)。
扩展欧几里得算法解决的最基本问题是gcd(a,b)=ax+by。证明转载至下:
对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然
存在整数对 x,y ,使得 gcd(a,b)=ax+by。
求解 x,y的方法的理解
设 a>b。
1,显然当 b=0,gcd(a,b)=a。此时 x=1,y=0;
2,a>b>0 时
设 ax 1+ by 1= gcd(a,b);
bx 2+ (a mod b)y 2= gcd(b,a mod b);
根据朴素的 欧几里德原理有 gcd(a,b) = gcd(b,a mod b);
则:ax 1+ by 1= bx 2+ (a mod b)y 2;
即:ax 1+ by 1= bx 2+ (a - [a / b] * b)y 2=ay 2+ bx 2- [a / b] * by 2;
也就是ax 1+ by1 == ay 2+ b(x 2- [a / b] *y 2);
根据恒等定理得:x 1=y 2; y 1=x 2- [a / b] *y 2;
这样我们就得到了求解 x 1,y 1 的方法:x
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值