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. 脱离Editor、VS等IDE如何编译UE4工程

    在Windows平台下,我们从.uproject文件生成VS解决方案.sln文件 .uproject文件用于打开Editor .sln文件用于打开VS工程 对于有增加C++代码的工程,Editor中和 ...

  2. 巩固javaweb第九天

    巩固内容: HTML <base> 元素 <base> 标签描述了基本的链接地址/链接目标,该标签作为HTML文档中所有的链接标签的默认链接: <head> < ...

  3. HDFS01 概述

    HDFS 概述 目录 HDFS 概述 HDFS的产生背景和定义 HDFS产生背景 HDFS定义 优缺点 优点 缺点 组成 NameNode DataNode Secondary NameNode(2n ...

  4. Portrait Photography Beginners Guide

    Please visit photoandtips稻糠亩 for more information. 六级/考研单词: vogue, derive, gorgeous, thereby, strict ...

  5. absurd, abundant

    absurd How: absolutely, completely, clearly, faintly, manifestly, obviously, patently, quite, rather ...

  6. C++ 数组元素循环右移问题

    这道题要求不用另外的数组,并且尽量移动次数少. 算法思想:设计一个结构体存储数组数据和它应在的索引位置,再直接交换,但是这种方法不能一次性就移动完成,因此再加一个判断条件.等这个判断条件满足后就退出循 ...

  7. 【Netty】最透彻的Netty原理架构解析

    这可能是目前最透彻的Netty原理架构解析 本文基于 Netty 4.1 展开介绍相关理论模型,使用场景,基本组件.整体架构,知其然且知其所以然,希望给大家在实际开发实践.学习开源项目方面提供参考. ...

  8. html块 布局

    可通过<div>和<span>将html元素组合起来. Html块元素 大多数html元素被定义为块级元素或内联元素. 块级元素在浏览器显示时,通常会以新行来开始(和结束).例 ...

  9. 关于java构造器

    关于java的构造器.首先构造器并不会创建java对象,构造器知识负责执行初始化,在构造器执行之前,Java对象所需要的内存空间是由new关键字申请出来的.大部分时候,程序使用new关键字为一个Jav ...

  10. mysql 执行报错:Error querying database. Cause: java.sql.SQLSyntaxErrorException:which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

    1.这个错误发生在mysql 5.7 版本及以上版本会出现的问题: mysql 5.7版本默认的sql配置是:sql_mode="ONLY_FULL_GROUP_BY",这个配置严 ...