题目链接:点击查看

题目大意:在 n∗mn*mn∗m 的矩阵中,从点 (0,0)(0,0)(0,0) 发射一个小球,以四十五度的方向出发,速度是 2\sqrt{2}2​,当碰到壁时,会进行反射;当碰到底角时,会被吸收。现在给出 kkk 次询问,每次询问需要回答点 (x,y)(x,y)(x,y) 是在什么时间第一次到达,如果无法到达输出 −1-1−1

题目分析:模拟也是可以做的,同样也可以从数论的角度去思考

考虑将矩形进行平面无限展开后,每一个点 (x,y)(x,y)(x,y) 都可以被表示为 (2∗n∗k1±x,2∗m∗k2±y)(2*n*k_1 \pm x,2*m*k_2 \pm y)(2∗n∗k1​±x,2∗m∗k2​±y),其中 k1k_1k1​ 表示的是穿过了多少条平行于 xxx 轴的边,k2k_2k2​ 表示的是穿过了多少条平行于 yyy 轴的边,因为在本题中速度是 45°45\degree45°,所以最终 xxx 和 yyy 坐标在无限展开后一定是相等的,显然有 2∗n∗k1±x=2∗m∗k2±y2*n*k_1 \pm x = 2*m*k_2 \pm y2∗n∗k1​±x=2∗m∗k2​±y,移项得到 2∗n∗k1−2∗m∗k2=±y−±x2*n*k_1-2*m*k_2=\pm y - \pm x2∗n∗k1​−2∗m∗k2​=±y−±x

然后将 (x,y)(x,y)(x,y) 分四种情况,分别用扩展欧几里得求一下最小正整数解维护答案的最小值就好了

需要注意的是,当时间大于等于 lcm(n,m)lcm(n,m)lcm(n,m) 后会被吸收,需要特判一下

代码:

// #pragma GCC optimize(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<unordered_map>
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
template<typename T>
inline void read(T &x)
{T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f;
}
template<typename T>
inline void write(T x)
{if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0');
}
const int inf=0x3f3f3f3f;
const int N=1e6+100;
LL ans,limit;
LL n,m,k;
template<class T> void exgcd(T a,T b,T &d,T &x,T &y){if(!b) {d=a;x=1;y=0;}else {exgcd(b,a%b,d,y,x);y-=x*(a/b);}
}
//求解二元一次方程 a*x+b*y=c,一组解为x,y,无解则返回false
template<class T> bool Solve_equation(T a,T b,T c,T &x,T& y){T gcd;exgcd(a,b,gcd,x,y);if(c%gcd) return false;   //无解T k=c/gcd;x*=k;y*=k;T xplus=b/gcd,yplus=a/gcd; if(xplus<0) xplus*=-1;if(yplus<0) yplus*=-1;//此时求出的x,y即为一组解,该方程的通解形式为X=x+t*(b/gcd),Y=y-t*(a/gcd) t为任意正整数//根据题目要求我们需要构造特殊解x=(x%xplus+xplus)%xplus;y=(c-a*x)/b; //x的最小正整数解//y=(y%yplus+yplus)%yplus;x=(c-b*y)/b; //y的最小正整数解return true;
}
void solve(LL dx,LL dy)
{LL k1,k2;if(!Solve_equation(2*n,-2*m,dy-dx,k1,k2)) return;LL res=2*n*k1+dx;if(res>=limit) return;if(ans==-1||res>=0&&ans>res) ans=res;
}
int main()
{#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);read(n),read(m),read(k);limit=n*m/__gcd(n,m);while(k--){int x,y;read(x),read(y);ans=-1;solve(x,y),solve(x,-y),solve(-x,y),solve(-x,-y);write(ans),putchar('\n');}return 0;
}

CodeForces - 724C Ray Tracing(扩展欧几里得解方程)相关推荐

  1. Codeforces 724C Ray Tracing 扩展欧几里得

    吐槽:在比赛的时候,压根就没想到这题还可以对称: 题解:http://blog.csdn.net/danliwoo/article/details/52761839 比较详细: #include< ...

  2. 扩展欧几里得 解方程小记

    本来以前学习的时候就懵懵懂懂,长时间不用就完全不会了.. 首先对于扩展欧几里得,对于最一般的方程形式 ax+by=gcd(a,b),此方程一定有整数解,扩展欧几里便得能够求出其中的一组整数解x0,y0 ...

  3. HDU 5514 Collision(扩展欧几里得+解方程)——2014ACM/ICPC亚洲区北京站

    传送门 Matt is playing a naive computer game with his deeply loved pure girl. The playground is a recta ...

  4. qdu 2017级纳新题(扩展欧几里得)

    在你面前撒个娇 哎呦喵喵喵喵喵 Description 我们一起学猫叫 一起喵喵喵喵喵 在你面前撒个娇 哎呦喵喵喵喵喵 我的心脏砰砰跳 迷恋上你的坏笑 你不说爱我我就喵喵喵 每当xjy和hqy一起唱起 ...

  5. Ray Tracing(扩展欧几里得,ax+by=c最小解)

    C. Ray Tracing time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  6. 扩展欧几里得求多组解CodeForces - 1244C

    扩展欧几里得求多组解 扩展欧几里得可以求得满足ax+by = c的一组解(这里c%gcd(a,b)要等于0):假如求得的解为(x0 , y0),G = gcd(a , b),这时我们可以发现(x0 + ...

  7. Codeforces7C 扩展欧几里得

    Line Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submit Status ...

  8. 扩展欧几里得 POJ 1061

    感觉这道题目的数据好水啊...我的代码我都觉得姿势特别奇怪...竟然还过了... 好吧,原来不是姿势奇怪,而是逆元需要用的时候是余数也需要的时候,这里的余数是不需要的,所以就AC了 就说一下碰到的问题 ...

  9. 求逆元(线性求逆元)及其扩展欧几里得

    线性求逆元模板: int inv[maxn]; void initInverse(){inv[1] = 1;for(int i = 2; i <= maxn; i++)inv[i] = (p - ...

最新文章

  1. python 数据分析学什么-利用Python做数据分析 需要学习哪些知识
  2. 问题引发由于与GI相关的python脚本中的错误,Gnome终端无法启动
  3. 如何垂直居中一个img
  4. 【DDD/CQRS/微服务架构案例】在Ubuntu 14.04.4 LTS中运行WeText项目的服务端
  5. QTP基础学习(二)启动与设置
  6. [react] React怎样引入svg的文件?
  7. mysql odbc.ini_ODBC连接mysql
  8. XDOJ-1002-小W的塔防(dp)
  9. Web中树形数据(层级关系数据)的实现—以行政区树为例
  10. 如何用绩效考核搞垮一个团队?
  11. 因缺思汀的绕过——实验吧
  12. 0基础学python要多久-怎么自学python,大概要多久?
  13. 2017-2018-1 20155320 嵌入式C语言——时钟
  14. Android: 一个两点触控的案例
  15. php如何自动阅卷,智能评卷系统 自动阅卷软件
  16. vscode格式化代码快捷键
  17. 2020计算机二级c语言答案,2020年全国计算机二级C语言考试试题分析
  18. 解决Adobe Reader 打开PDF文件10秒左右自动关闭问题
  19. 以图搜图-自动生成图模式匹配Cypher
  20. BaseFX 实习小记(一)

热门文章

  1. 第8章 SQL语言(一)
  2. python文件处理seek_python文件操作 seek(),tell()
  3. Nginx负载均衡策略介绍
  4. 通过yum安装Nginx
  5. 商业软件中常见的修饰词
  6. 数据库分库分表的几种方式
  7. 设计模式之_工厂系列_02
  8. 中文问好_直击/泷泽秀明秘访台!Hey! Say! JUMP也来了 亲切秀中文问好
  9. Redis源码编译安装
  10. 利用 git format-patch 和 git send-email 把修改的 patch 文件发送给 ffmpeg-devel