Codeforces Codeforces Round #484 (Div. 2) E. Billiard
Codeforces Codeforces Round #484 (Div. 2) E. Billiard
题目连接:
http://codeforces.com/contest/982/problem/E
Description
Consider a billiard table of rectangular size $n \times m$ with four pockets. Let's introduce a coordinate system with the origin at the lower left corner (see the picture).
There is one ball at the point $(x, y)$ currently. Max comes to the table and strikes the ball. The ball starts moving along a line that is parallel to one of the axes or that makes a $45^{\circ}$ angle with them. We will assume that:
- the angles between the directions of the ball before and after a collision with a side are equal,
- the ball moves indefinitely long, it only stops when it falls into a pocket,
- the ball can be considered as a point, it falls into a pocket if and only if its coordinates coincide with one of the pockets,
- initially the ball is not in a pocket.
Note that the ball can move along some side, in this case the ball will just fall into the pocket at the end of the side.
Your task is to determine whether the ball will fall into a pocket eventually, and if yes, which of the four pockets it will be.
Sample Input
4 3 2 2 -1 1
Sample Output
0 0
题意
给定一个球和方向,问能不能在盒子里停下来
Giving a ball and vector, judge it will stop in the box or not
官方题解以及机器翻译。。:
如果您在平面上相对于其两侧对称地反射矩形,则球的新轨迹将更容易。线性轨迹如果是正确的。一个可能的解决方案是
- 如果矢量与轴成90度角,则写入if-s。
- 否则,转动场以使影响矢量变为(1,1)。
- 写出球的直线运动方程: - 1·x + 1·y + C = 0。如果我们用球的初始位置代替,我们可以找到系数C.
- 请注意,在平面的无限平铺中,可以以(k1·n,k2·m)的形式表示任何孔的坐标。
- 用球的线的方程中的点的坐标代替。丢番图方程a·k1 + B·k2 = Cis。如果C |可以解决GCD(A,B)。否则,没有解决方案。
- 在这个丢番图方程的所有解中,我们对正半轴上的最小值感兴趣。
- 通过查找k1,k2可以很容易地得到相应口袋的坐标
- 如果需要,将场转回。
If you symmetrically reflect a rectangle on the plane relative to its sides, the new trajectory of the ball will be much easier. Linear trajectory if be correct. One possible solution is:
- If the vector is directed at an angle of 90 degrees to the axes, then write the if-s.
- Otherwise, turn the field so that the impact vector becomes (1, 1).
- Write the equation of the direct motion of the ball: – 1·x + 1·y + C = 0. If we substitute the initial position of the ball, we find the coefficient C.
- Note that in the infinite tiling of the plane the coordinates of any holes representable in the form (k1·n, k2·m).
- Substitute the coordinates of the points in the equation of the line of the ball. The Diophantine equation a·k1 + B·k2 = Cis obtained. It is solvable if C | gcd(A, B). Otherwise, there are no solutions.
- Of all the solutions of this Diophantine equation, we are interested in the smallest on the positive half-axis.
- By finding k1, k2 it is easy to get the coordinates of the corresponding pocket
- Rotate the field back if required.
代码
#include <bits/stdc++.h>
using namespace std;
long long x, y, xx, yy;
long long vx, vy;
long long fx, fy;
long long c;
long long ex_gcd(long long a, long long b, long long &xa, long long &ya) {
if (!b) {
xa = c;
ya = 0;
return a;
}
long long ret = ex_gcd(b, a % b, xa, ya);
long long temp = xa;
xa = ya;
ya = temp - (a / b) * ya;
return ret;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cerr.tie(nullptr);
cin >> x >> y >> xx >> yy >> vx >> vy;
if (!vx) {
if (xx == 0 || xx == x) {
if (vy == 1) {
cout << xx << " " << y;
} else {
cout << xx << " " << 0;
}
} else
return 0 * puts("-1");
return 0;
}
if (!vy) {
if (yy == 0 || yy == y) {
if (vx == 1) {
cout << x << " " << yy;
} else {
cout << 0 << " " << yy;
}
} else
return 0 * puts("-1");
return 0;
}
if (vx == -1) fx = 1, xx = x - xx;
if (vy == -1) fy = 1, yy = y - yy;
c = xx - yy;
if (c % __gcd(x, y))
return 0 * puts("-1");
c /= __gcd(x, y);
long long m = y / __gcd(x, y);
long long xxx, yyy;
ex_gcd(x, y, xxx, yyy);
xxx = (xxx % m + m - 1) % m + 1;
yyy = -(yy - xx + x * xxx) / y;
long long ansn = x, ansm = y;
if (xxx % 2 == 0) ansn = x - ansn;
if (yyy % 2 == 0) ansm = y - ansm;
if (fx) ansn = x - ansn;
if (fy) ansm = y - ansm;
cout << ansn << " " << ansm;
}
Codeforces Codeforces Round #484 (Div. 2) E. Billiard的更多相关文章
- 【数论】【扩展欧几里得】Codeforces Round #484 (Div. 2) E. Billiard
题意:给你一个台球桌面,一个台球的初始位置和初始速度方向(只可能平行坐标轴或者与坐标轴成45度角),问你能否滚进桌子四个角落的洞里,如果能,滚进的是哪个洞. 如果速度方向平行坐标轴,只需分类讨论,看它 ...
- Codeforces Codeforces Round #484 (Div. 2) D. Shark
Codeforces Codeforces Round #484 (Div. 2) D. Shark 题目连接: http://codeforces.com/contest/982/problem/D ...
- Codeforces Beta Round #80 (Div. 2 Only)【ABCD】
Codeforces Beta Round #80 (Div. 2 Only) A Blackjack1 题意 一共52张扑克,A代表1或者11,2-10表示自己的数字,其他都表示10 现在你已经有一 ...
- Codeforces Beta Round #83 (Div. 1 Only)题解【ABCD】
Codeforces Beta Round #83 (Div. 1 Only) A. Dorm Water Supply 题意 给你一个n点m边的图,保证每个点的入度和出度最多为1 如果这个点入度为0 ...
- Codeforces Beta Round #79 (Div. 2 Only)
Codeforces Beta Round #79 (Div. 2 Only) http://codeforces.com/contest/102 A #include<bits/stdc++. ...
- Codeforces Beta Round #77 (Div. 2 Only)
Codeforces Beta Round #77 (Div. 2 Only) http://codeforces.com/contest/96 A #include<bits/stdc++.h ...
- Codeforces Beta Round #76 (Div. 2 Only)
Codeforces Beta Round #76 (Div. 2 Only) http://codeforces.com/contest/94 A #include<bits/stdc++.h ...
- Codeforces Beta Round #75 (Div. 2 Only)
Codeforces Beta Round #75 (Div. 2 Only) http://codeforces.com/contest/92 A #include<iostream> ...
- Codeforces Beta Round #74 (Div. 2 Only)
Codeforces Beta Round #74 (Div. 2 Only) http://codeforces.com/contest/90 A #include<iostream> ...
随机推荐
- spring、mybatis事务配置和控制
springmybatis.xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi= ...
- SVN使用教程总结(转载)
SVN简介: 为什么要使用SVN? 程序员在编写程序的过程中,每个程序员都会生成很多不同的版本,这就需要程序员有效的管理代码,在需要的时候可以迅速,准确取出相应的版本. Subversion是什么? ...
- JS的基本(原始)数据类型
1.boolean true & false 2.null 空值类型 3.undefined 未定义类型 4.number 数值类型 5.string 字符串类型 6.sy ...
- ES6 Promise 用法转载
Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方法,原型上有then.catch等同样很眼熟的方法. 那就new一个 var p = new Promise( ...
- keepalived添加服务自启动报错分析
安装完keepalived后设置为服务自启动 将路径为/usr/local/src/keepalived-1.3.4/keepalived/etc/init.d的文件keepalived拷贝到/etc ...
- Android 网络编程的陷阱
陷阱一,不要在主线程或者UI线程中建立网络连接 Androd4.0以后,不允许在主线程中建立网络连接,不然会出现莫名其妙的程序退出情况.正确的做法是在主线程中,创建新的线程来运行网络连接程序. // ...
- Linux samba多用户挂载
samba 多用户挂载 通过multiuser挂载选项,使用基于密码验证和cifscreds实现访问控制在默认情况下,samba共享挂载后,是通过挂载时的验证来实现对挂载资源的访问控制.通过新的mul ...
- I/O多路复用、协程、线程、进程
select注册fd,阻塞,当有fd状态改变时返回,确认对应的fd,做下一步处理.简单来说就是先注册,注册完后休眠并设置一个定时器醒来查看,有事件就通知来取,进行后续动作,没事件就继续睡,再设闹钟.用 ...
- scrapy爬取58同城二手房问题与对策
测试环境: win10,单机爬取,scrapy1.5.0,python3.6.4,mongodb,Robo 3T 其他准备: 代理池:测试环境就没有用搭建的flask抓代理,因为我找到的几个免费网站有 ...
- Linux驱动之平台设备驱动模型简析(驱动分离分层概念的建立)
Linux设备模型的目的:为内核建立一个统一的设备模型,从而有一个对系统结构的一般性抽象描述.换句话说,Linux设备模型提取了设备操作的共同属性,进行抽象,并将这部分共同的属性在内核中实现,而为需要 ...