传送门: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