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) 先用扩展欧几里 ...
随机推荐
- 大场前端工程师常使用CSS3特性做跨域也是牛逼前端的开始之路
通过 CSS3 的 content 获取内容,很有意思的一个思路,实际场景中有可能用的到: CSST (CSS Text Transformation) 利用js动态创建一个link插入到文档中, 请 ...
- let import export React入门实例教程 connect provider combineReducers 箭头函数 30分钟掌握ES6/ES2015核心内容 Rest babel
let与var的区别 http://www.cnblogs.com/snandy/archive/2015/05/10/4485832.html es6 导入导出 http://www.csdn.ne ...
- APIO强掠计划(spfa+tarjan缩点)
强掠计划 题目大意: \(Siruseri\) 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定,在每个路口都设立了一个 \(Siruseri\) 银行的 \(ATM\) 取款机.令人奇怪的 ...
- Codeforces 1292C Xenon's Attack on the Gangs 题解
题目 On another floor of the A.R.C. Markland-N, the young man Simon "Xenon" Jackson, takes a ...
- Django---进阶3
目录 无名有名分组反向解析 路由分发 名称空间(了解) 伪静态(了解) 虚拟环境(了解) django版本区别 视图层 三板斧 JsonResponse对象 form表单上传文件及后端如何操作 req ...
- 使用CodeMirror插件遇到的问题
CodeMirror的正常使用: //首先通过<script>标签引入相应的js,这个就不必说了 var myCodeMirror = CodeMirror.fromTextArea(my ...
- 二、kafka 中央控制器、主题、分区、副本
集群和中央控制器 一个独立的Kafka服务器被称为broker.broker用来接收来自生产者的消息,为消息设置偏移量,并把消息保存到磁盘.换句话说,多个kafka实例组成kafka集群,每个实例(s ...
- Windows Socket编程精华《TCP通信服务器》
1.网络中进程之间如何通信? 首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的.其实TCP/IP协议族已经帮我们解决了这个问 ...
- 03 Vue实例成员
Vue实例 1.el:实例 new Vue({ el: '#app' }) // 实例与页面挂载点一一对应 // 一个页面中可以出现多个实例对应多个挂载点 // 实例只操作挂载点内部内容 2.data ...
- JavaScript学习 Ⅳ
八. 批量创建对象 使用工厂方法创建对象 function creatPerson(name, age, gender='男'){ var obj = new Object(); obj.name = ...