Ray Tracing

题目链接:http://codeforces.com/problemset/problem/724/C

拓展欧几里得

//为什么这次C题这么难啊=。=

可以观察到,光线在矩形中运动的时间为LCM(n,m),所以可以把整个矩阵扩展成LCM(n,m)*LCM(n,m)的矩阵[光线从(0,0)点一直射到(LCM(n,m),LCM(n,m))点],然后将点关于矩形的四条边变换到直线y=x上,取最小的即可。

变换后得到的点的纵坐标为2*p*n±X,横坐标为2*q*m±Y,因为要求在直线y=x上,故2*p*n±X=2*q*m±Y,移项得2*p*n-2*q*m=±X±Y。

而拓展欧几里得可以解不定方程a*x+b*y=c,其中c=GCD(a,b),令a=2*n,b=-2*m,求得x和y。

将方程a*x+b*y=c变换成2*p*n-2*q*m=±X±Y,得到p或q,求出2*p*n±X或2*q*m±Y即可。

//注意求得的p或q要为自然数

代码如下:

 #include<iostream>
#include<cstdio>
#include <cmath>
using namespace std;
typedef long long LL;
const LL INF=;
LL GCD(LL a,LL b){
return b==?a:GCD(b,a%b);
}
LL exGCD(LL a,LL b,LL &x,LL &y){
if(b==){
x=,y=;
return a;
}
LL t=exGCD(b,a%b,x,y);
LL r=x;x=y;y=r-a/b*y;
return t;
}
LL LCM(LL a,LL b){
LL gcd=GCD(a,b);
return (a/gcd)*b;
}
LL n,m,k,x,y,p,q,a,b,lim,mul;
LL mix(LL x,LL y){
LL t=x-y;
if(t%mul!=)return INF;
t/=mul;
p=a*t;
LL mod=abs((-*m)/mul);//mod is the t of p*x*t-q*y*t=gcd*t
p=(p%mod+mod)%mod;
LL tmp=INF;
LL tt=*n*p-x;
if(<tt&&tt<=lim)tmp=min(tmp,tt);
return tmp;
}
int main(void){
scanf("%I64d%I64d%I64d",&n,&m,&k);
lim=LCM(n,m);
for(LL i=;i<k;++i){
scanf("%I64d%I64d",&x,&y);
mul=exGCD(*n,-*m,a,b);
//mul=GCD(2*n,-2*m);
LL ans=INF;
ans=min(ans,mix(-x,y));
ans=min(ans,mix(x,y));
ans=min(ans,mix(-x,-y));
ans=min(ans,mix(x,-y));
if(ans<INF)printf("%I64d\n",ans);
else printf("-1\n");
}
}

Ray Tracing的更多相关文章

  1. OpenCascade Ray Tracing Rendering

    OpenCascade Ray Tracing Rendering eryar@163.com 摘要Abstract:OpenCascade6.7.0中引入了光线跟踪算法的实现.使用光线跟踪算法可实现 ...

  2. 开始研究Ray tracing

    几个月前面试时Boss问过我一个问题--"除了scanline渲染方法,你还知道什么其他渲染方式?",我没答出来,至今记忆犹新. 前段时间摆弄Intel VTune时看了它的示例代 ...

  3. 《Ray Tracing in One Weekend》、《Ray Tracing from the Ground Up》读后感以及光线追踪学习推荐

    <Ray Tracing in One Weekend> 优点: 相对简单易懂 渲染效果相当好 代码简短,只看书上的代码就可以写出完整的程序,而且Github上的代码是将基类与之类写在一起 ...

  4. 【Ray Tracing The Next Week 超详解】 光线追踪2-7 任意长方体 && 场景案例

    上一篇比较简单,很久才发是因为做了一些好玩的场景,后来发现这一章是专门写场景例子的,所以就安排到了这一篇 Preface 这一篇要介绍的内容有: 1. 自己做的光照例子 2. Cornell box画 ...

  5. 【RAY TRACING THE REST OF YOUR LIFE 超详解】 光线追踪 3-7 混合概率密度

     Preface 注:鉴于很多网站随意爬取数据,可能导致内容残缺以及引用失效等问题,影响阅读,请认准原创网址: https://www.cnblogs.com/lv-anchoret/category ...

  6. 【RAY TRACING THE REST OF YOUR LIFE 超详解】 光线追踪 3-5 random direction & ONB

     Preface 往后看了几章,对这本书有了新的理解 上一篇,我们第一次尝试把MC积分运用到了Lambertian材质中,当然,第一次尝试是失败的,作者发现它的渲染效果和现实有些出入,所以结尾处声明要 ...

  7. 【RAY TRACING THE REST OF YOUR LIFE 超详解】 光线追踪 3-4 基于重要性采样的材质初探

     Preface 我们今天来把第三本书从开局到现在讲的一大堆理论运用到我们的框架中,那么今天我们首先将原始的材质改为基于重要性采样原理的材质 这一篇是代码工程中进行MC理论应用的初步尝试篇  Read ...

  8. 【Ray Tracing The Next Week 超详解】 光线追踪2-9

    我们来整理一下项目的代码 目录 ----include --hit --texture --material ----RTdef.hpp ----ray.hpp ----camera.hpp ---- ...

  9. 【Ray Tracing The Next Week 超详解】 光线追踪2-8 Volume

     Preface 今天有两个东东,一个是体积烟雾,一个是封面图 下一篇我们总结项目代码 Chapter 8:Volumes 我们需要为我们的光线追踪器添加新的物体——烟.雾,也称为participat ...

随机推荐

  1. js面向对象小结(工厂模式,构造函数,原型方法,继承)

    最近过了一遍尼古拉斯泽卡斯的高级程序设计第三版(红皮书)第六章:面向对象程序设计,现在把总结出来的东西和大家分享一下. 主要内容如下: 1.工厂模式 2.构造函数模式 3.原型模式 4.继承 一.工厂 ...

  2. Python 购物车----之用户部分

    知识点: 文件读,写操作,if 判断, for 循环 salary = input("输入你的工资:") bought_list = [] product_list = {} wi ...

  3. 简介alert()与console.log()的不同

    简单的说alert 是弹出提示而console.log是在调试工具里打日志,下面具体给大家列出alert()与console.log()的不同点, [1]alert() [1.1]有阻塞作用,不点击确 ...

  4. UITabelview的删除

    删除的效果 Automatic Bottom Fade left middle none right top 简单删除 先删除数据源里的数据,然后再删除cell,否者会报错 let indexPath ...

  5. 第一百三十二节,JavaScript,封装库--下拉菜单

    JavaScript,封装库--下拉菜单 封装库,增加了3个方法 shu_biao_yi_ru_yi_chu()方法,给元素设置鼠标移入移出事件,接收两个参数,参数是移入和移出时的执行函数(包含代码) ...

  6. 使用Asponse.Cell解决Excel科学计数法问题

    //fileName --文件路径 public DataSet DataSetGetDataFromExcel(string fileName) { DataSet dataset = new Da ...

  7. iOS 通知的使用

    学习通知,我们要掌握:通知的发布 , 通知的监听 , 通知的移除 在通知里面,有一个非常重要的东西: 通知中心(NSNotificationCenter); 每一个应用程序,都有一个通知中心,专门用来 ...

  8. Linux网络常用头文件说明

    sys/types.h:数据类型定义 sys/socket.h:提供socket函数及数据结构 netinet/in.h:定义数据结构sockaddr_in arpa/inet.h:提供IP地址转换函 ...

  9. 在二叉搜索树(BST)中查找第K个大的结点之非递归实现

    一个被广泛使用的面试题: 给定一个二叉搜索树,请找出其中的第K个大的结点. PS:我第一次在面试的时候被问到这个问题而且让我直接在白纸上写的时候,直接蒙圈了,因为没有刷题准备,所以就会有伤害.(面完的 ...

  10. Hibernate5-课程笔记4

    单表查询:   Hibernate是DAO层技术,对数据的使用,查询是最为重要的.Hibernate的查询技术非常强大,支持原始SQL语句查询,支持QBC查询及Hibernate特有的HQL查询. H ...