Collision(hdu5114)

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 }
时间: 2024-10-16 12:15:12

Collision(hdu5114)的相关文章

1. md5 collision(50)

md5 collision(50)      ------南京邮电大学ctf: http://chinalover.sinaapp.com/web19/ 发现了一串代码 <?php $md51 = md5('QNKCDZO'); $a = @$_GET['a']; $md52 = @md5($a); if(isset($a)){ if ($a != 'QNKCDZO' && $md51 == $md52) { echo "nctf{*****************}&qu

Fast Paxos(转)

自从Lamport在1998年发表Paxos算法后,对Paxos的各种改进工作就从未停止,其中动作最大的莫过于2005年发表的Fast Paxos.无论何种改进,其重点依然是在消息延迟与性能.吞吐量之间作出各种权衡.为了容易地从概念上区分二者,称前者Classic Paxos,改进后的后者为Fast Paxos. 1. Fast Paxos概览 Lamport在40多页的论文中不仅提出了Fast Paxos算法,并且还从工程实践的角度重新描述了Paxos,使其更贴近应用场景.从一般的Client

ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse

ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中使用. 提供ROS接口的3D软件比较多,本章以最典型的Gazebo介绍为主,从Player/Stage/Gazebo发展而来,现在独立的机器人仿真开发环境,目前2016年最新版本Gazebo7.1配合ROS(kinetic)使用. 补充内容:http://blo

糍粑大叔的独游之旅-战斗!之弹道实现(上)

本来应该接着将PopupMenu,但具体开发的笔记本不在身边,手头的电脑上没有最新的代码,所以只能暂时停下那个内容,先谈谈另外一个有趣的内容——u3d实现子弹弹道. 当然这个完整的说,也非常复杂,还是由浅入深,先说说最核心的原理. 一.定义 我将子弹分为至少两种: 1.实体型.即发射后,生成一个带刚体的gameobject,可以通过u3d的物理引擎实现碰撞检测.比如机关枪子弹.弹道等等. 2.射线型.即子弹的运动和碰撞不由刚体实现,弹道控制由代码实现,通过Physics2D下函数或自己计算物体检

深入研究虚幻4反射系统实现原理(一)

上一篇翻译的文章里面提到了UE4反射系统的基本原理与应用,这次我们通过代码来深入研究一下UE4的反射系统,因为反射系统在UE4中牵扯的东西较多,所以我打算分几篇文章分析.我这里假定读者对UE4有一定的了解并且有一定的C++基础,如果不了解UE4如何使用,那么请先学会如何使用UE4引擎,否则看起来可能会比较困难. 以下是我整理的一个跟反射系统相关的类图: 从上面可以看出UObject是整个反射系统核心,UE4中支持反射的类型在上一篇文章中已经说过,包括 C++类.结构体.函数 .成员变量以及枚举,

常见hash算法的原理(转)

常见hash算法的原理 散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法.顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙. 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的数组叫做散列表. 比如我们存储70个元素,但我们可能为这70个元素申请了100个元素的空间.7

大话Java中的哈希(hash)结构(一)

o( ̄▽ ̄)d 小伙伴们在上网或者搞程序设计的时候,总是会听到关于“哈希(hash)”的一些东西.比如哈希算法.哈希表等等的名词,那么什么是hash呢? 一.相关概念 1.hash算法:一类特殊的算法(注意哦,hash算法并不是某个固定的算法,而是一类特殊功能算法的统称). 2.哈希表(hash table).哈希映射(hash map).哈希集合(hash set):一种基于hash算法的数据结构. 3.哈希函数:在hash算法中的核心函数. 4.map:译为“映射”,是一种从键(key)到值

【Unity】11.2 刚体(Rigidbody)

分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 Rigidbody(刚体)组件可使游戏对象在物理系统的控制下来运动,刚体可接受外力与扭矩力,使游戏对象像在真实世界中那样进行运动. 任何游戏对象,只有对其添加了刚体组件,该对象才能受重力的影响. 通过脚本为游戏对象添加的作用力,以及通过NVIDlA物理引擎与其他的游戏对象发生互动的运算,都需要为游戏对象添加刚体组件. 二.如何为对象添加刚体 在Unity 5.x中为某个游戏对象添加刚体组件的办法是:选中要添加刚体的游

Java集合类总结 (三)

HashSet类 关于HashMap的实现细节 HashMap是用LinkedList实现的,每个list被称为一个桶(bucket),在hashmap中要查找一个元素,首先对传入的key进行散列,并根据散列函数(最简单的散列函数是取余运算)找到是哪个桶,然后在顺着桶的linkedlist寻找这个key.向HashMap插入一个元素时也一样,先算散列函数,应该存在到哪个桶上,如果这个桶上没有存任何元素,就叫没有散列冲突(hash collision),那直接存进去即可.如果发生了冲突,即已经有元