CF724C: Ray Tracing
CF的题质量真心不低,这道题的标准解法(应该)是exgcd,打比赛的时候想到了具体的推导公式了,也意识到了需要用exgcd,但是因为寝室要锁门了(其实就是太弱,就放弃了。
首先很显然,这条线所经过的总时间应该是$lcm(N,M)$,其实这一点用处不大,但是如果想到了这一点,那么下一步就很好想出来,也就是这整个矩阵的射线轨迹是可以展开在一个$lcm(N,M) \times lcm(N,M)$的矩阵上。到了这一步,只需要把矩形上的每个点铺开在矩阵上然后验证最近的一个点使得在展开的矩阵上横纵坐标相等。
现在问题就转换成了不断的对称一个矩形形成一个正方形,问矩形的每个点在正方形上的坐标。
在进一步就很好看出,对于原矩形上的点$(x,y)$,其在展开的矩形上的对称点应该是$( (k \times 2 \times N) \pm x, (q\times 2\times N) \pm y)$,
然后需要求的就是最小的$ (k \times 2 \times N) \pm x$使得$(k \times 2 \times N)\pm x = (q\times 2\times N) \pm y$
这个就可以用exgcd解决。
也就是用exgcd求$ax+by=c$的问题,简单说一下就是$a=N \times 2$,而且$b=-M \times 2$,$c=\pm x \pm y$,求解这四个方程的最小正整数解。
//CF 724C
//by Cydiater
//2016.10.9
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
#include <ctime>
#include <cmath>
#include <string>
#include <cstdio>
#include <queue>
#include <map>
using namespace std;
#define ll long long
#define up(i,j,n) for(ll i=j;i<=n;i++)
#define down(i,j,n) for(ll i=j;i>=n;i--)
inline ll read(){
char ch=getchar();ll x=0,f=1;
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
ll N,M,K,X,Y,ans,oo;
namespace solution{
ll gcd(ll a,ll b){return b==0?a:gcd(b,a%b);}
void exgcd(ll a,ll b,ll &x,ll &y){
if(b==0){x=1;y=0;return;}
exgcd(b,a%b,x,y);
ll t=x;x=y;y=t-a/b*y;
}
void equ(ll a,ll b,ll c,ll &x,ll &y){
exgcd(a,b,x,y);ll d=gcd(a,b);
if(c%d!=0){x=oo;return;}
ll mod=abs(b/d);
x*=c/d;
x=((x%mod+mod)%mod+mod)%mod;
}
ll get(ll tx,ll ty){
ll a=(N<<1),b=-(M<<1),c=ty-tx,x,y;
equ(a,b,c,x,y);
if(x==oo)return oo;
ll ans=2*x*N+tx;
if(ans<0||ans>=oo)return oo;
return ans;
}
void slove(){
N=read();M=read();K=read();oo=N*M/gcd(N,M)+1;
up(i,1,K){
X=read();Y=read();
ans=oo;
ans=min(ans,get(X,Y));
ans=min(ans,get(-X,Y));
ans=min(ans,get(-X,-Y));
ans=min(ans,get(X,-Y));
if(ans==oo)ans=-1;
printf("%I64d\n",ans);
}
}
}
int main(){
//freopen("input.in","r",stdin);
using namespace solution;
slove();
return 0;
}
CF724C: Ray Tracing的更多相关文章
- CF724C Ray Tracing 扩展欧几里得 平面展开
LINK:Ray Tracing 虚这道题很久了 模拟赛考了一个加强版的 瞬间就想到了这道简化版的. 考虑做法 暴力模拟可能可以 官方正解好像就是这个. 不过遇到这种平面问题可以考虑把平面给无限的展开 ...
- OpenCascade Ray Tracing Rendering
OpenCascade Ray Tracing Rendering eryar@163.com 摘要Abstract:OpenCascade6.7.0中引入了光线跟踪算法的实现.使用光线跟踪算法可实现 ...
- 开始研究Ray tracing
几个月前面试时Boss问过我一个问题--"除了scanline渲染方法,你还知道什么其他渲染方式?",我没答出来,至今记忆犹新. 前段时间摆弄Intel VTune时看了它的示例代 ...
- Ray Tracing
Ray Tracing 题目链接:http://codeforces.com/problemset/problem/724/C 拓展欧几里得 //为什么这次C题这么难啊=.= 可以观察到,光线在矩形中 ...
- 《Ray Tracing in One Weekend》、《Ray Tracing from the Ground Up》读后感以及光线追踪学习推荐
<Ray Tracing in One Weekend> 优点: 相对简单易懂 渲染效果相当好 代码简短,只看书上的代码就可以写出完整的程序,而且Github上的代码是将基类与之类写在一起 ...
- 【Ray Tracing The Next Week 超详解】 光线追踪2-7 任意长方体 && 场景案例
上一篇比较简单,很久才发是因为做了一些好玩的场景,后来发现这一章是专门写场景例子的,所以就安排到了这一篇 Preface 这一篇要介绍的内容有: 1. 自己做的光照例子 2. Cornell box画 ...
- 【RAY TRACING THE REST OF YOUR LIFE 超详解】 光线追踪 3-7 混合概率密度
Preface 注:鉴于很多网站随意爬取数据,可能导致内容残缺以及引用失效等问题,影响阅读,请认准原创网址: https://www.cnblogs.com/lv-anchoret/category ...
- 【RAY TRACING THE REST OF YOUR LIFE 超详解】 光线追踪 3-5 random direction & ONB
Preface 往后看了几章,对这本书有了新的理解 上一篇,我们第一次尝试把MC积分运用到了Lambertian材质中,当然,第一次尝试是失败的,作者发现它的渲染效果和现实有些出入,所以结尾处声明要 ...
- 【RAY TRACING THE REST OF YOUR LIFE 超详解】 光线追踪 3-4 基于重要性采样的材质初探
Preface 我们今天来把第三本书从开局到现在讲的一大堆理论运用到我们的框架中,那么今天我们首先将原始的材质改为基于重要性采样原理的材质 这一篇是代码工程中进行MC理论应用的初步尝试篇 Read ...
随机推荐
- android之广播(二)
广播接受者不仅可以通过清单文件来向系统注册,也可以通过代码来注册.并且有的广播必须通过代码来注册广播接受者. 锁屏和解锁广播 电量改变广播 打开屏幕和关闭屏幕 这里将广播接收者写在服务里面 <? ...
- android listview 的监听事件
今天遇到了一个比较让我头疼的问题,不过追根揭底只是我对listview理解的不够透彻罢了, 闲言少叙,说说我遇到的问题吧: 上篇随笔我写了关于listview的使用,如果你也已经写好了列表那么恭喜这一 ...
- linux基础-第十六单元 yum管理RPM包
第十六单元 yum管理RPM包 yum的功能 本地yum配置 光盘挂载和镜像挂载 本地yum配置 网络yum配置 网络yum配置 Yum命令的使用 使用yum安装软件 使用yum删除软件 安装组件 删 ...
- 腾讯云CentOS 安装MediaWiki
参考 : https://www.digitalocean.com/community/tutorials/how-to-install-mediawiki-on-centos-7 //安装好很多次终 ...
- .NET中的垃圾回收
目录 l 导言 l 关于垃圾回收 l 垃圾回收算法 m 应用程序根(Application Roots) l 实现 m ...
- CDN 备胎技巧
如果你使用 CDN 服务,建议准备一个备胎,万一 CDN 服务挂了,可以从自己的服务器上读取: <script src="http://cdn.staticfile.org/jquer ...
- hdu3555 数位dp
Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Subm ...
- Jquery 获取 radio/select选中值
Radio <input type="radio" name="rd" id="rd1" checked="checked& ...
- sql-schema与catalog
schema: 指的是说当偶create database caiceclb时,caiceclb就是一个schema catalog: 指的是所有的database目录,就像上图显示的那样,将MySQ ...
- C#-WebForm-★ 上传水印图片 ★
上传水印图片就是一个选择图片.添加水印.进行上传的过程 绘制图片需要准备: 画布 - 大小 笔 - 颜色.粗细.样式 用什么字体 要画什么(李献策lxc) 步骤: 一.引用 System.Drawin ...