Collision

Time Limit: 15000/15000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others)
Total Submission(s): 846    Accepted Submission(s): 200

Problem Description
Matt is playing a naive computer game with his deeply loved pure girl.

The playground is a rectangle with walls around. Two balls are put in different positions inside the rectangle. The balls are so tiny that their volume can be ignored. Initially, two balls will move with velocity (1, 1). When a ball collides with any side of the rectangle, it will rebound without loss of energy. The rebound follows the law of refiection (i.e. the angle at which the ball is incident on the wall equals the angle at which it is reflected).

After they choose the initial position, Matt wants you to tell him where will the two balls collide for the first time.
 
Input
The first line contains only one integer T which indicates the number of test cases.

For each test case, the first line contains two integers x and y. The four vertices of the rectangle are (0, 0), (x, 0), (0, y) and (x, y). (1 ≤ x, y ≤ 105)

The next line contains four integers x1, y1, x2, y2. The initial position of the two balls is (x1, y1) and (x2, y2). (0 ≤ x1, x2 ≤ x; 0 ≤ y1, y2 ≤ y)
 
Output
For each test case, output “Case #x:” in the first line, where x is the case number (starting from 1). 

In the second line, output “Collision will not happen.” (without quotes) if the collision will never happen. Otherwise, output two real numbers xc and yc, rounded to one decimal place, which indicate the position where the two balls will first collide.
 
Sample Input
3
10 10
1 1 9 9
10 10
0 5 5 10
10 10
1 0 1 10
 
Sample Output
Case #1:
6.0 6.0
Case #2:
Collision will not happen.
Case #3:
6.0 5.0
Hint
In first example, two balls move from (1, 1) and (9, 9) both with velocity (1, 1), the ball starts from (9, 9) will rebound at point (10, 10) then move with velocity (−1, −1). The two balls will meet each other at (6, 6).
 思路:扩展欧几里德;
 首先可以知道,要相遇肯定在整数点,和半数点处,那么我们先将所有的都乘以2,为了防止小数。
 当x1 = x2的时候,那么无论啥时候,x1=x2;那么这个时候,只要求y1=y2的时刻,
  ty =(m-(y2+(m-y1)))/2+m-y1 = (2*n-(y1+y2))/2;那么根据ty 可以求得坐标;
 同理y1=y2;
 那么当x1!=x2&&y1!=y2的时候,
 得到t1 = tx+k1*n;t2  =ty+k2*m;
  那么t2 = t1;所以解两个同余方程即可,取最小的t;
  1 #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<stdlib.h>
5 #include<string.h>
6 #include<math.h>
7 #include<queue>
8 using namespace std;
9 typedef long long LL;
10 pair<LL,LL>exgcd(LL n,LL m);
11 LL solve(LL x, LL y,LL n,LL m);
12 LL gcd(LL n,LL m);
13 int main(void)
14 {
15 LL n,m,k;
16 int N;
17 int __ca = 0;
18 scanf("%d",&N);
19 while(N--)
20 {
21 scanf("%lld %lld",&n,&m);
22 LL x1,y1,x2,y2;
23 n*=2;
24 m*=2;
25 scanf("%lld %lld %lld %lld",&x1,&y1,&x2,&y2);
26 x1*=2;
27 y1*=2,x2*=2;
28 y2*=2;
29 printf("Case #%d:\n",++__ca);
30 if(x1==x2&&y1==y2)
31 {
32 printf("%.1f %.1f\n",x1/2,y1/2);
33 }
34 else if(x1==x2)
35 {
36 LL ty = (2*m-(y1+y2))/2;
37 LL yy = min(y1,y2)+ty;
38 LL xx = min(x1,x2)+ ty;
39 if((xx/n)%2==0)
40 {
41 xx = xx%n;
42 }
43 else
44 {
45 xx = ((n-xx)%n+n)%n;
46 if(xx == 0)xx = n;
47 }
48 if((yy/m)%2==0)
49 {
50 yy = yy%m;
51 }
52 else
53 {
54 yy = ((m-yy)%m+m)%m; if(yy == 0)yy = m;
55 }
56 printf("%.1lf %.1lf\n",xx/2.0,yy/2.0);
57 }
58 else if(y1 == y2)
59 {
60 LL tx = (2*n-(x1+x2))/2;
61 LL yy = min(y1,y2)+tx;
62 LL xx = min(x1,x2)+tx;
63 if((yy/m)%2==0)
64 {
65 yy = yy%m;
66 }
67 else
68 {
69 yy = ((m-yy)%m+m)%m;
70 if(yy == 0)yy = m;
71 }
72 if((xx/n)%2==0)
73 {
74 xx = xx%n;
75 }
76 else
77 {
78 xx = ((n-xx)%n+n)%n;
79 if(xx == 0)xx = n;
80 }
81 printf("%.1lf %.1lf\n",xx/2.0,yy/2.0);
82 }
83 else
84 {
85 LL ty = (2*m-(y1+y2))/2;
86 LL tx = (2*n-(x1+x2))/2;
87 LL ask = solve(tx,ty,n,m);
88 if(ask==1e18)
89 printf("Collision will not happen.\n");
90 else
91 {
92 LL yy = y1+ask;
93 if((yy/m)%2==0)
94 {
95 yy = yy%m;
96 //if(yy == 0)yy = m;
97 }
98 else
99 {
100 yy = ((m-yy)%m+m)%m;
101 if(yy == 0)yy = m;
102 }
103 LL xx = x1+ask;
104 if((xx/n)%2==0)
105 {
106 xx = xx%n;
107 }
108 else
109 {
110 xx = ((n-xx)%n+n)%n;
111 if(xx == 0)xx = n;
112 }
113 printf("%.1lf %.1lf\n",xx/2.0,yy/2.0);
114 }
115 }
116
117 }
118 return 0;
119 }
120 pair<LL,LL>exgcd(LL n,LL m)
121 {
122 if(m==0)
123 return make_pair(1,0);
124 else
125 {
126 pair<LL,LL>ak = exgcd(m,n%m);
127 return make_pair(ak.second,ak.first-(n/m)*ak.second);
128 }
129 }
130 LL solve(LL x, LL y,LL n,LL m)
131 {
132 LL cc = n;
133 LL c = x-y;
134 LL gc = gcd(n,m);
135 if(c%gc)return 1e18;
136 else
137 {
138 c/=gc;
139 n/=gc;
140 m/=gc;
141 pair<LL,LL>ak = exgcd(n,m);
142 LL x0 = (ak.first*c%m+m)%m;
143 LL lcm = (LL)m*cc;
144 x = x-cc*x0;
145 x = x%lcm+lcm;
146 x%=lcm;
147 return x;
148 }
149 }
150 LL gcd(LL n,LL m)
151 {
152 if(m==0)return n;
153 else return gcd(m,n%m);
154 }

Collision(hdu5114)的更多相关文章

  1. 1. md5 collision(50)

    md5 collision(50)      ------南京邮电大学ctf: http://chinalover.sinaapp.com/web19/ 发现了一串代码 <?php $md51 ...

  2. Core源码(二) Linq的Distinct扩展

    先贴源码地址 https://github.com/dotnet/corefx/tree/master/src/System.Linq/src .NET CORE很大一个好处就是代码的开源,你可以详细 ...

  3. 【Unity3D基础教程】给初学者看的Unity教程(四):通过制作Flappy Bird了解Native 2D中的RigidBody2D和Collider2D

    作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 在第一篇文章[Unity3D基础教程] ...

  4. CCNA网络工程师学习进程(2)基本的网络设备

      在组网技术中用到的设备有中继器(Repeater).集线器(Hub).网桥(Bridge).交换机(Switch).路由器(Router).分别工作在OSI参考模型中的物理层.数据链路层和网络层. ...

  5. 为什么带网格(mesh)的模型添加了刚体Rigidbody和MeshCollider,还是会从地板穿过去?

    两个Gameobject 放置在空中, 一个是Cube,一个是茄子模型 Cube的Collider 是Box Collider , 茄汁的Collider 是mesh collider, 他们都添加了 ...

  6. 【Unity3D基础教程】给初学者看的Unity教程(一):GameObject,Compoent,Time,Input,Physics

    作者:王选易,出处:http://www.cnblogs.com/neverdie/  欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点推荐.谢谢! Unity3D重要模块的类图 最近刚刚完成了一 ...

  7. [转载] 散列表(Hash Table)从理论到实用(上)

    转载自:白话算法(6) 散列表(Hash Table)从理论到实用(上) 处理实际问题的一般数学方法是,首先提炼出问题的本质元素,然后把它看作一个比现实无限宽广的可能性系统,这个系统中的实质关系可以通 ...

  8. [转载] 散列表(Hash Table) 从理论到实用(下)

    转载自: 白话算法(6) 散列表(Hash Table) 从理论到实用(下) [澈丹,我想要个钻戒.][小北,等等吧,等我再修行两年,你把我烧了,舍利子比钻戒值钱.] ——自扯自蛋 无论开发一个程序还 ...

  9. PHP学习笔记:对命名空间(namespace)学习资料的翻译

    Name collisions means: you create a function named db_connect, and somebody elses code that you use ...

随机推荐

  1. linux 实用指令搜索查找类

    linux 实用指令搜索查找类 目录 linux 实用指令搜索查找类 find指令 locate指令 grep指令和管道符号 | find指令 说明 从指定目录向下递归地遍历其各个子目录,将满足条件的 ...

  2. Swift-技巧(十一)重写运算符

    摘要 基础数据的运算可以直接使用四则运算符.在 Swift 中也可以通过重写四则运算符的方式,让 struct 或者 class 创建的结构体或者对象也能像基础数据那样直接使用四则运算符. Swift ...

  3. 26. Linux GIT

    windows git 下载链接: Msysgit   https://git-scm.com/download/win 1 进入git bash进行第一次配置 git config --global ...

  4. 商业爬虫学习笔记day3

    一. 付费代理发送请求的两种方式 第一种方式: (1)代理ip,形式如下: money_proxy = {"http":"username:pwd@192.168.12. ...

  5. 『学了就忘』Linux启动引导与修复 — 69、启动引导程序(grub)

    目录 1.启动引导程序(Boot Loader)简介 2.启动引导程序grub的作用 3.启动引导程序grub的位置 4./grub目录中其他的文件简单介绍 提示: 简单地说,Boot Loader就 ...

  6. 设置linux下oracle开机自启动

    1.修改配置文件,vi /etc/oratab orcl:/u01/app/oracle/product/11.2.0/db_1:Y 2.创建启动文件,/etc/init.d/ #!/bin/sh # ...

  7. Linux:while read line与for循环的区别

    while read line:是一次性将文件信息读入并赋值给变量line , while中使用重定向机制,文件中的所有信息都被读入并重定向给了整个while 语句中的line 变量. for:是每次 ...

  8. Zookeeper的选举算法和脑裂问题

    ZK介绍 ZK = zookeeper ZK是微服务解决方案中拥有服务注册发现最为核心的环境,是微服务的基石.作为服务注册发现模块,并不是只有ZK一种产品,目前得到行业认可的还有:Eureka.Con ...

  9. 【Linux】【Services】【nfs】nfs安装与配置

    1. 概念 1.1. NFS:Network File System,传统意义上,文件系统在内核中实现. 1.2. RPC:Remote Procedure Call protocol,远程过程调用, ...

  10. 【Java 8】Optional 使用

    一.前言 如果要给 Java 所有异常弄个榜单,我会选择将 NullPointerException 放在榜首.这个异常潜伏在代码中,就像个遥控炸弹,不知道什么时候这个按钮会被突然按下(传入 null ...