原文链接http://www.cnblogs.com/zhouzhendong/p/9055728.html

题目传送门 - Codeforces 928E

题意

  一束与坐标轴平行或者成$45^\circ$角的光线在一个矩形区域内反射。

  如图:

  

  给定矩形的长宽,以及光源位置、光线初始方向,问它最先到达四个角落中的哪一个角落。如果永远不能到达,输出$-1$。

题解

  本来不想写的。本次CF又打烂了。

  D题一个傻逼错误调了40多分钟。

  E题貌似挺可做的。可是来不及啊。(再加上深更半夜神志不清)

  

  我们来回顾一下初中数学套路。

  考虑将每次反射做一个对称。

  我来画一下一组数据:

  5 3 4 0 1 1

  

  通过对称,我们把它画成这样(经典初中数学套路):

  

  然后问题就大致变成了求直线到达的第一个满足$n|T_x,m|T_y$的点$(T_x,T_y)$。

  为了方便,我们再把原图画成这样:

  

  问题进一步简化,变成从$s'$出发的问题了。

  设$S=(x,y)$,则$S'=(0,y-x)$,

  不难列出方程:

  $an+(y-x)=bm \Longrightarrow an+bm=(x-y)$

  然后我们用exgcd来解一下这个方程,首先判掉无解的情况,输出$-1$。

  然后注意一下我们要求的是第一个碰到的这样的点,所以在特殊情况的时候要小心。

  要取$a$的尽量小的正整数值。我一开始写错了,对$m$取模,然后突然发现应该对$m/gcd(n,m)$取模……

  然后根据算出来的$a$以及$b$的奇偶性来确定到达的位置。

  至于一开始输入的:

    如果是平行坐标轴的,那么直接判掉。

    如果是$45^\circ$的,那么我们可以通过在原矩形中取对称来使其变成我们需要的那样。

  题外话:

  又错失一次上黄的机会QAQ。

  话说我的代码跑的挺快的。

  话说为什么目前我$friends$里面的三位大佬(xza,bestfy,emoairx)的代码怎么都要跑几百$MS$……后来才发现他们的那个循环好像不是$O(1)$的……

  QAQ大佬都会写循环……只有我这种菜鸡才去写公式。关键是还写挂了调了有一会儿……(就是之前提到过的那个问题)

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int n,m,x,y,vx,vy;
int refx,refy;
LL exgcd(LL a,LL b,LL &x,LL &y){if (!b){x=1,y=0;return a;}LL res=exgcd(b,a%b,y,x);y-=(a/b)*x;return res;
}
int main(){scanf("%d%d%d%d%d%d",&n,&m,&x,&y,&vx,&vy);if (vx==0){if (x==0||x==n){if (vy==1)printf("%d %d\n",x,m);elseprintf("%d %d\n",x,0);}elseputs("-1");return 0;}if (vy==0){if (y==0||y==m){if (vx==1)printf("%d %d\n",n,y);elseprintf("%d %d\n",0,y);}elseputs("-1");return 0;}if (vx==-1)refx=1,x=n-x;if (vy==-1)refy=1,y=m-y;//s'=(0,y-x)//an+(y-x)=bm => an+bm=(x-y)LL a,b,g;g=exgcd(n,m,a,b);if ((x-y)%g!=0){puts("-1");return 0;}LL t=(x-y)/g;a*=t,b*=t;int _m=m/g,_n=n/g;LL _a=(a%_m+_m+_m-1)%_m+1,_b=-((x-y)-_a*n)/m;LL ansx=n,ansy=m;if (_a%2==0)ansx=n-ansx;if (_b%2==0)ansy=m-ansy;if (refx)ansx=n-ansx;if (refy)ansy=m-ansy;printf("%I64d %I64d",ansx,ansy);return 0;
}

  

转载于:https://www.cnblogs.com/zhouzhendong/p/CF982E.html

Codeforces 982E Billiard 扩展欧几里德相关推荐

  1. Codeforces 982E Billiard exgcd

    Billiard 枚举终点, 对于每一个终点一共有四种周期的相遇方式, 枚举一下取最小的时间. #include<bits/stdc++.h> #define LL long long # ...

  2. Codeforces Beta Round #7 C. Line 扩展欧几里德

    C. Line time limit per test 1 second memory limit per test 256 megabytes input standard input output ...

  3. 欧几里德算法 扩展欧几里德算法

    欧几里德算法 欧几里德算法又称辗转相除法,是指用于计算两个正整数a,b的最大公约数. 计算公式:gcd(a,b) = gcd(b,a mod b). 算法实现: public static int g ...

  4. 扩展欧几里德算法详解

    转自:http://blog.csdn.net/zhjchengfeng5/article/details/7786595 扩展欧几里德算法 谁是欧几里德?自己百度去 先介绍什么叫做欧几里德算法 有两 ...

  5. poj 2115 C Looooops(扩展欧几里德算法)

    题意: 对于for(i=A ; i!=B ;i+=C)循环语句,问在k位存储系统中循环几次才会结束. 比如:当k=4时,存储的数 i 在0-15之间循环.(本题默认为无符号) 若在有限次内结束,则输出 ...

  6. 欧几里德与扩展欧几里德算法——密码学笔记(五)

    一.欧几里德算法 又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a% ...

  7. 欧几里德算法与扩展欧几里德算法

    欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd( ...

  8. 数论:扩展欧几里德(洛谷P1516 青蛙的约会)

    欧几里德 基本思想:gcd(q,r)=gcd(r,q%r); 证明,设q.r的最大公因数为a,则q=xa,r=ya,xy互质 不妨设x>y(显然如果小于会在一次gcd运算后交换) 则q%r=(x ...

  9. POJ2891 Strange Way to Express Integers (扩展欧几里德)

    本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia 题目大意 求解一组同余方程 x ≡ r1 (mod a1) x ≡ r2 (mod a2) x ≡ r ...

最新文章

  1. 智能指针unique_ptr
  2. 企业真的要培养员工?
  3. 相移波束形成算法的MATLAB仿真
  4. Maven 创建web项目
  5. 个人喜欢的关于模式识别、机器学习、推荐系统、图像特征、深度学习、数值计算、目标跟踪等方面个人主页及博客
  6. 云原生应用架构转型不好做?阿里云让你一步到位!
  7. python--学习笔记6 pandas
  8. zz测试接口_使用FizzBu​​zz和JUnitParams进行单元测试
  9. LeetCode MySQL 1873. 计算特殊奖金(case when then else end)
  10. 【OpenCV】OpenCV访问像素点的三种方式
  11. 2020年最前沿的 8 本AI技术图书—文末留言赠8本
  12. http常见的get请求方式和set请求方式。
  13. 20172329 2017-2018-2 《程序设计与数据结构》第五周学习总结
  14. STM8S 低功耗模式
  15. 按120分计算成绩 mysql_mySql数据库基础
  16. 口胡平衡树splay
  17. 计算机硬件知识硬盘,DIY硬件知识:小白必看的硬盘基础知识大全
  18. Python免安装环境(Windows)
  19. java实现请假时间判断
  20. Matplotlib学习手册A005_Figure的add_axes()方法

热门文章

  1. 宽带猫拨号报错651,虚惊一场
  2. autojs ui界面漂亮模板
  3. 【洛谷3043】跳楼机(最短路)
  4. WPF 程序的编译过程
  5. word页眉添加横线与删除横线
  6. Activiti6:模拟钉钉上面的请假流程(使用web画图并导出xml然后使用java执行流程)
  7. golang 浮点数操作
  8. 边缘计算的深刻详细解读
  9. AWGN信道下卷积编码、viterbe译码、分别采用软硬判决,进行误码率分析
  10. 职业生涯自我规划五步法