CF724C Ray Tracing 扩展欧几里得 平面展开
LINK:Ray Tracing
虚这道题很久了 模拟赛考了一个加强版的 瞬间就想到了这道简化版的。
考虑做法 暴力模拟可能可以 官方正解好像就是这个。
不过遇到这种平面问题可以考虑把平面给无限的展开。
考虑展开之后点的坐标的通项 2kn +/- x 2km +/- y.
这个可以画图发现 那么就可以得到4个方程。
暴力解开 考虑遇到四个角就停止的问题 那么这个值必须要小于LCM(n,m).
显然 同时要保证合法的话需要>0.
容易发现方程只需要解一次 所以复杂度为 k+logn.
(真是ex死我了
ll n,m,k;
ll lcm,g,maxx;
ll xx,yy,ww;
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline void exgcd(ll a,ll b)
{
if(!b){xx=1,yy=0;ww=a;return;}
exgcd(b,a%b);
ll z=xx;xx=yy;yy=z-a/b*yy;
return;
}
inline ll solve(ll x,ll y)
{
ll c=y-x;
if(c%ww)return -1;
ll b=-m/ww;
c/=ww;b=abs(b);
ll w1=(xx*c%b+b)%b;
ll ans=n*w1+x;
return ans<=0||ans>=lcm?-1:ans;
}
signed main()
{
freopen("1.in","r",stdin);
n=read();m=read();k=read();
g=gcd(n,m);lcm=n*m/g;
n=n*2;m=m*2;
exgcd(n,-m);
for(ll i=1;i<=k;++i)
{
ll w,x,y;maxx=INF;
x=read();y=read();
if(!x&&!y){printf("0\n");continue;}
w=solve(x,y);if(w!=-1)maxx=min(maxx,w);
w=solve(x,-y);if(w!=-1)maxx=min(maxx,w);
w=solve(-x,y);if(w!=-1)maxx=min(maxx,w);
w=solve(-x,-y);if(w!=-1)maxx=min(maxx,w);
printf("%lld\n",maxx==INF?-1:maxx);
}
return 0;
}
CF724C Ray Tracing 扩展欧几里得 平面展开的更多相关文章
- Codeforces 724C Ray Tracing 扩展欧几里得
吐槽:在比赛的时候,压根就没想到这题还可以对称: 题解:http://blog.csdn.net/danliwoo/article/details/52761839 比较详细: #include< ...
- Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) C.Ray Tracing (模拟或扩展欧几里得)
http://codeforces.com/contest/724/problem/C 题目大意: 在一个n*m的盒子里,从(0,0)射出一条每秒位移为(1,1)的射线,遵从反射定律,给出k个点,求射 ...
- C. Ray Tracing——披着搜索外衣的扩展欧几里得
[题目大意] 给你一个n*m的矩形,光线从(0,0)出发,沿右上方向以每秒根号2米的速度运动,碰到矩形边界就会反弹(符合物理规律的反弹),询问k个点,这些点都在矩形内部且不在矩形边界上,求光经过这些点 ...
- UVA 12169 Disgruntled Judge 枚举+扩展欧几里得
题目大意:有3个整数 x[1], a, b 满足递推式x[i]=(a*x[i-1]+b)mod 10001.由这个递推式计算出了长度为2T的数列,现在要求输入x[1],x[3],......x[2T- ...
- UVA 10090 Marbles 扩展欧几里得
来源:http://www.cnblogs.com/zxhl/p/5106678.html 大致题意:给你n个球,给你两种盒子.第一种盒子每个盒子c1美元,可以恰好装n1个球:第二种盒子每个盒子c2元 ...
- POJ 1061 青蛙的约会 扩展欧几里得
扩展欧几里得模板套一下就A了,不过要注意刚好整除的时候,代码中有注释 #include <iostream> #include <cstdio> #include <cs ...
- 【64测试20161112】【Catalan数】【数论】【扩展欧几里得】【逆】
Problem: n个人(偶数)排队,排两行,每一行的身高依次递增,且第二行的人的身高大于对应的第一行的人,问有多少种方案.mod 1e9+9 Solution: 这道题由1,2,5,14 应该想到C ...
- poj 2891 扩展欧几里得迭代解同余方程组
Reference: http://www.cnblogs.com/ka200812/archive/2011/09/02/2164404.html 之前说过中国剩余定理传统解法的条件是m[i]两两互 ...
- poj 2142 扩展欧几里得解ax+by=c
原题实际上就是求方程a*x+b*y=d的一个特解,要求这个特解满足|x|+|y|最小 套模式+一点YY就行了 总结一下这类问题的解法: 对于方程ax+by=c 设tm=gcd(a,b) 先用扩展欧几里 ...
随机推荐
- web前端开发书籍推荐_css/css3的好书有哪些?
css/css3样式已是web前端开发的主流技术了.每个优秀的前端程序员都应该熟悉,甚至精通css.那么要如何才能学好css,并很好的应用到实际开发中,这篇文章就推荐一些关于css相关的书籍给大家. ...
- Ants,小小思维题。
题目链接 题意: 蚂蚁在一个杆子上行走,每个蚂蚁有开始的位置,且速度都是1,如果蚂蚁“相撞”就会各自回头,以原速度继续行走,走到杆子边上就会掉下去,请问最快都掉下去的时间和最慢都掉下去的时间. 题目分 ...
- 常用js代码片段(一)
1.如果数组所有元素都满足函数条件,则返回true.调用时,如果省略第二个参数,则默认传递布尔值. const all= (arr, fn=Boolean) => arr.every(fn); ...
- php基础学习中认为重点的知识
<?php ... ?> 简写成 <? ... ?> 服务器中可以通过php.ini中配置short_open_tag为on来实现 php语句必须以分号 ; 结尾 . 连接 ...
- python 装饰器(五):装饰器实例(二)类装饰器(类装饰器装饰函数)
回到装饰器上的概念上来,装饰器要求接受一个callable对象,并返回一个callable对象(不太严谨,详见后文). 那么用类来实现也是也可以的.我们可以让类的构造函数__init__()接受一个函 ...
- 数据可视化之分析篇(八)Power BI数据分析应用:结构百分比分析法
https://zhuanlan.zhihu.com/p/113113765 PowerBI数据分析02:结构百分比分析法 作者:海艳 结构百分比分析法,又称纵向分析,是指同一期间财务报表中不同项目间 ...
- LeetCode 84 | 单调栈解决最大矩形问题
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题第52篇文章,我们一起来看LeetCode第84题,Largest Rectangle in Histogram( ...
- XML解析---利用XStream解析xml数据及反构造Java对象
XStream 是一个轻量级的.简单易用的开放源代码 Java库,用于将 Java 对象序列化为 XML 或者再转换回来.而且XStream还能将java对象转成其它格式,比如JSon. 需要用到的包 ...
- 数据结构C语言实现----出栈操作
代码如下: #include<stdio.h> #include<stdlib.h> typedef struct { char *base; char *top; int s ...
- OSCP Learning Notes - File Transfers(1)
File transfer type: 1. HTTP Transfer files through the website. 2.wget wget http://10.0.0.109/exploi ...