博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CodeForces 724C Ray Tracing(碰撞类,扩展gcd)
阅读量:6495 次
发布时间:2019-06-24

本文共 1459 字,大约阅读时间需要 4 分钟。

  又一次遇到了碰撞类的题目,还是扩展gcd和同余模方程。上次博客的链接在这:。

  现在干脆解同余模直接按照套路来吧,如果有解,那么x先乘以(c/g),然后mod数是(b/g),就按照这个套路来好了- -。

  这题的思路大概是这样的,首先碰到墙壁的角肯定会在lcm(n,m)时刻发生,这之后是原路返回的,也就是说如果在这个时间之前都没有碰到的点一定是永远碰不到的。

  对每一个点(x0,y0)来说,解 2nx+(-)x0 = 2ny+(-)y0。其中x和y是变量,那么移项以后显然是同余模方程。我们关于x0和y前的符号作一下讨论,解四个方程,取最小即可。

  具体代码如下:

1 #include 
2 #include
3 #include
4 #include
5 using namespace std; 6 typedef long long ll; 7 8 ll n,m,k; 9 ll maxn;10 11 void ex_gcd(ll a,ll b,ll &x,ll &y,ll &g)12 {13 if(!b) {x=1;y=0;g=a;return;}14 ex_gcd(b,a%b,y,x,g);15 y -= a/b*x;16 }17 18 ll work(ll dx,ll dy)19 {20 ll g,x,y;21 ex_gcd(2*n,2*m,x,y,g);22 ll c = dy - dx;23 if(c % g) return maxn+1;24 25 x *= (c/g);26 ll mod = 2*m / g;27 x = (x%mod + mod) % mod;28 29 ll temp = 2*n*x + dx;30 if(temp<0 || temp>maxn) return maxn+1;31 else return temp;32 }33 34 ll solve(ll x,ll y)35 {36 ll ans = maxn + 1;37 ans = min(ans,work(x,y));38 ans = min(ans,work(-x,y));39 ans = min(ans,work(x,-y));40 ans = min(ans,work(-x,-y));41 if(ans == maxn+1) return -1;42 else return ans;43 }44 45 int main()46 {47 cin >> n >> m >> k;48 ll g = __gcd(n,m);49 maxn = n / g * m;50 while(k--)51 {52 ll x,y;53 scanf("%I64d%I64d",&x,&y);54 printf("%I64d\n",solve(x,y));55 }56 }

 

转载于:https://www.cnblogs.com/zzyDS/p/5962896.html

你可能感兴趣的文章
微软职位内部推荐-Software Engineer II-News
查看>>
(转)I 帧和 IDR 帧的区别
查看>>
如何更快速加载你的JS页面
查看>>
解决oracle11g安装导致数据库无法自动搜集统计信息-转
查看>>
Unix_Linux系统定时器的应用(案例)
查看>>
[Java基础] Java如何实现条件编译
查看>>
【转】ubuntu 12.04 下 Vim 插件 YouCompleteMe 的安装
查看>>
设置网页标题图标
查看>>
mysql通过查看跟踪日志跟踪执行的sql语句
查看>>
Android_CodeWiki_01
查看>>
Web QQ 协议 登录加密算法 —— VC++实现
查看>>
Nutch 二次开发之parse正文内容
查看>>
代码储存
查看>>
微信公众平台对所有公众号开放自定义菜单
查看>>
Visual C++ 2012/2013的内存溢出检測工具
查看>>
ubuntu操作系统下载
查看>>
更改git bash默认的路径
查看>>
hdu 4452 Running Rabbits 模拟
查看>>
SQL Server 储存过程的output 参数
查看>>
IOS开发中多线程的使用
查看>>