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:

  1. the angles between the directions of the ball before and after a collision with a side are equal,
  2. the ball moves indefinitely long, it only stops when it falls into a pocket,
  3. 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,
  4. 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的更多相关文章

  1. 【数论】【扩展欧几里得】Codeforces Round #484 (Div. 2) E. Billiard

    题意:给你一个台球桌面,一个台球的初始位置和初始速度方向(只可能平行坐标轴或者与坐标轴成45度角),问你能否滚进桌子四个角落的洞里,如果能,滚进的是哪个洞. 如果速度方向平行坐标轴,只需分类讨论,看它 ...

  2. Codeforces Codeforces Round #484 (Div. 2) D. Shark

    Codeforces Codeforces Round #484 (Div. 2) D. Shark 题目连接: http://codeforces.com/contest/982/problem/D ...

  3. Codeforces Beta Round #80 (Div. 2 Only)【ABCD】

    Codeforces Beta Round #80 (Div. 2 Only) A Blackjack1 题意 一共52张扑克,A代表1或者11,2-10表示自己的数字,其他都表示10 现在你已经有一 ...

  4. Codeforces Beta Round #83 (Div. 1 Only)题解【ABCD】

    Codeforces Beta Round #83 (Div. 1 Only) A. Dorm Water Supply 题意 给你一个n点m边的图,保证每个点的入度和出度最多为1 如果这个点入度为0 ...

  5. Codeforces Beta Round #79 (Div. 2 Only)

    Codeforces Beta Round #79 (Div. 2 Only) http://codeforces.com/contest/102 A #include<bits/stdc++. ...

  6. Codeforces Beta Round #77 (Div. 2 Only)

    Codeforces Beta Round #77 (Div. 2 Only) http://codeforces.com/contest/96 A #include<bits/stdc++.h ...

  7. Codeforces Beta Round #76 (Div. 2 Only)

    Codeforces Beta Round #76 (Div. 2 Only) http://codeforces.com/contest/94 A #include<bits/stdc++.h ...

  8. Codeforces Beta Round #75 (Div. 2 Only)

    Codeforces Beta Round #75 (Div. 2 Only) http://codeforces.com/contest/92 A #include<iostream> ...

  9. Codeforces Beta Round #74 (Div. 2 Only)

    Codeforces Beta Round #74 (Div. 2 Only) http://codeforces.com/contest/90 A #include<iostream> ...

随机推荐

  1. iOS10以下版本不支持swiper

    解决办法,降低swiper4*版本引用低版本如3.4.2可以兼容iOS8,

  2. virtualbox下centos虚拟机安装,并网卡配置桥接方式上网,使得和host可以互Ping通。

    见:http://www.cnblogs.com/taoshiqian/p/7615993.html 注意: 1.host 主机什么都不要处理 2.将virtualbox 的对应虚拟机网络设置桥接 3 ...

  3. C语言基础01

    1. 用scanf清理缓冲区数据 scanf("%*[^\n]"); scanf("%*c"); 2. 格式转换 将无符号整型数value转换成字符串并返回该字 ...

  4. 关于MVC工厂模式的增删改查sql存储过程

    这里MVC中用到了反射,工厂,泛型,接口 在搭建框架的时候,除了MVC的三层以外,还有泛型的接口层和工厂层 下面是dal层调用sql存储过程,增删改查,dal层继承了接口层,实现了接口层里面的方法 1 ...

  5. xml嵌套防止解析

    举个例子 <?xml version="1.0" encoding="UTF-8"?><Messages><Message typ ...

  6. Jboss项目部署出现java.lang.UnsupportedClassVersionError 问题的解决方法

    出现java.lang.UnsupportedClassVersionError 错误的原因,是因为我们使用高版本的JDK编译的Java class文件试图在较低版本的JVM上运行,所报的错误. 解决 ...

  7. Linux rhcsa认证考试试题模拟

    声明: 此套试题是2017年rhcsa考试题库,本题库需配合相对应的机器操作,实验环境在我的网盘下载 考试环境: server.group8.example.com 172.24.8.254/24 s ...

  8. paloalto防火墙的优势

    1.所有 Palo Alto Networks 防火墙提供一个可用于执行防火墙管理功能的带外管理端口 (MGT).通过使用该 MGT 端口,可以将防火墙的管理功能与数据处理功能分开,从而保护对防火墙的 ...

  9. Hillstone设备管理-恢复出厂设置

    1.CLI命令行操作 unset all: 根据提示选择是否保存当前配置y/n: 选择是否重启y/n: 系统重启后即恢复到出厂设置. 2.webUI操作 “系统”—“配置”,点击“清除”按钮,系统会提 ...

  10. 一篇教你看懂spring bean工厂和aop

    这篇文章为spring回顾总结的第二篇,本篇主要分为两个部分,分别是spring的bean工厂的实现.spring的aop实现原理,这两部分也是面试当中问的比较多的. spring的bean工厂的实现 ...