Description

给出一个骑士的 $N$种 中行走的方式 $(a_i, b_i)$, 可以使骑士的坐标$(-a,-b)$或$(+a,+b)$。

我们需要找出 第二个骑士的 两种行走方式 $(c_1, d_1)$ 和 $(c_2, d_2)$ 使得 两个骑士能走到的点 完全相同。

保证$a_i, b_i$ 不会同时$=0$。

Solution

真的是比较神奇的解法, 只需要会exgcd就能够做的题(然而我真的没有想到。

我们要将  两个 不竖直的 向量 $(a_1, b_1)$ , $(a_2, b_2)$ 转换成 等价的  一个不竖直向量$(a_3,b_3)$和 一个竖直向量$(0,b_4)$

也就是下图中的 两条绿线

   (我是真的不会画图QAQ) 图源

然后我们就能发现  能走到的点  的 水平距离 为 $gcd(a_1, a_2)$。

并且 横坐标相同的点 , 纵坐标的差 为 $(a_1 \times b_2 \ - \ a_2 \ times b_1)\div gcd(a_1,a_2)$

  证明: 设 $a_1 \times x_1 + a_2 \times y_1= $横坐标

     那么 $b_1 \times x_1 + b_2 \times y_1=$纵坐标

     根据扩展欧几里得, $x = x_1  + k \times a_2 \div gcd, y  = y_1 - k \times a_1 \div gcd$,

              把$x, y$带入第二个式子, 就得到了纵坐标差为 $(a_1 \times b_2 \ - \ a_2 \times b_1)\div gcd(a_1,a_2)$。

接着使 $a_3 = gcd(a_1,a_2)$,  并算出 满足  $a_1 \times x_1 + a_2 \times y_1= gcd(a_1,a_2)$ 的 $x_1$, 和$y_1$。

令$b_3 = b_1 \times x_1 + b_2 \times y_1$。

$b_4 = (a_1 \times b_2 \ - \ a_2 \times b_1)\div gcd(a_1,a_2)$

并且这两个向量是与 转换之前的向量 等价, 即它们所构成的 所有坐标都相同。

所有的竖直向量都可以合并成 $gcd$, 所以我们把得到的 竖直向量与之前的竖直向量合并成一个。

这样每一次操作 两个向量 都会变成 一个向量。 最后只剩一个竖直向量 和 一个不竖直向量 就是要的答案了。

Code

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define rd read()
using namespace std;
typedef pair<int, int> P; const int N = 1e5 + ; int n, ans1, ans2; queue<P> q; int read() {
int X = , p = ; char c = getchar();
for (; c > '' || c < ''; c = getchar())
if (c == '-') p = -;
for (; c >= '' && c <= ''; c = getchar())
X = X * + c - '';
return X * p;
} int gcd(int x, int y) {
if (!x || !y)
return x + y;
return gcd(y, x % y);
} int exgcd(int a, int b, int &x, int &y) {
if (b == ) {
x = ; y = ;
return a;
}
int d = exgcd(b ,a % b, x , y), z = y;
y = x - a/b * y; x = z;
return d;
} #define fir first
#define sec second int main()
{
n = rd;
for (int i = ; i <= n; ++i) {
int a = rd, b = rd;
if (a == ) ans2 = gcd(ans2, b);
else q.push(P(a, b));
}
for (; q.size() > ;) {
P u = q.front(), v; q.pop();
v = q.front(); q.pop();
int x, y;
int a = exgcd(u.fir, v.fir, x ,y), b = u.sec * x + v.sec * y;
int t = (u.fir * v.sec - u.sec * v.fir) / a;
q.push(P(a, b));
ans2 = gcd(ans2, t);
}
printf("0 %d\n", ans2);
if (q.empty()) printf("0 %d\n", ans2 * );
else {
P t = q.front();
printf("%d %d\n", t.fir, t.sec);
}
}

Luogu 3421 [POI2005]SKO-Knights - Exgcd的更多相关文章

  1. Luogu 3424 [POI2005]SUM-Fibonacci Sums

    Solution 没有任何算法, 只要会$for$ 就能AC... 我们观察到, 如果有一个位置 的$F_i$ 的系数$b_i$ 为2, 那么只需要把 $b_{i-2}+1,b_{i+1}+1$即可. ...

  2. luogu P3420 [POI2005]SKA-Piggy Banks

    题目描述 Byteazar the Dragon has NN piggy banks. Each piggy bank can either be opened with its correspon ...

  3. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  4. Codeforces Gym100812 L. Knights without Fear and Reproach-扩展欧几里得(exgcd)

    补一篇以前的扩展欧几里得的题,发现以前写错了竟然也过了,可能数据水??? 这个题还是很有意思的,和队友吵了两天,一边吵一边发现问题??? L. Knights without Fear and Rep ...

  5. Luogu P1082 同余方程(exgcd模版)

    传送门 求ax%b = 1,即ax - by = 1: 很明显这是一个exgcd的形式. 那么要做这道题,首先需要gcd和exgcd的算法作铺垫. gcd(辗转相膜法): int gcd(int a, ...

  6. 【Luogu】P2485计算器(快速幂,exgcd和Bsgs模板)

    题目链接 题目描述非常直接,要求你用快速幂解决第一问,exgcd解决第二问,bsgs解决第三问. emmmm于是现学bsgs 第二问让求最小整数解好烦啊…… 假设我们要求得方程$ax+by=c(mod ...

  7. luogu P3409 值日班长值周班长 exgcd

    LINK:值日班长值周班长 题目描述非常垃圾. 题意:一周5天 每周有一个值周班长 每天有一个值日班长 值日班长日换 值周班长周换. 共n个值日班长 m个值周班长 A是第p个值日班长 B是第q个值日班 ...

  8. Luogu[POI2005]KOS-Dicing

    题面 二分后用网络流判定 S->人,流量为二分的mid 人->比赛,流量为1 比赛->T,流量为1 输出方案只要判断a就可以了 # include <bits/stdc++.h ...

  9. Re:Exgcd解二元不定方程

    模拟又炸了,我死亡 $exgcd$(扩展欧几里德算法)用于求$ax+by=gcd(a,b)$中$x,y$的一组解,它有很多应用,比如解二元不定方程.求逆元等等,这里详细讲解一下$exgcd$的原理. ...

随机推荐

  1. js模板引擎用法

    JavaScript模板引擎Template.js使用详解 作者:A_山水子农 字体:[增加 减小] 类型:转载 时间:2016-12-15我要评论 这篇文章主要为大家详细介绍了JavaScript模 ...

  2. 2018面向对象程序设计(Java)第12周学习指导及要求

    2018面向对象程序设计(Java)第12周学习指导及要求 (2018.11.15-2018.11.18)   学习目标 (1) 掌握Java GUI中框架创建及属性设置中常用类的API: (2) 掌 ...

  3. SSM框架下,使用ajax请求上传文件(doc\docx\excel\图片等)

    1.准备工作 1.1.添加上传必要jar包 <dependency> <groupId>commons-io</groupId> <artifactId> ...

  4. JMeter学习(三十四)使用jmeter来发送json/gzip格式数据(转载)

    转载自 http://www.cnblogs.com/yangxia-test 一.使用jmeter来发送gzip数据 有时候我们需要模拟在客户端将数据压缩后, 发送(post)到服务器端. 通常这种 ...

  5. 数据库类型空间效率探索(三)-char

    测试环境 表信息 表数据量22.23万,占用空间44.494M 用到的sql语句 增加列:alter table t_type add column new_column char(1) defaul ...

  6. 二 random模块

    1 import random 2 3 print(random.random())#(0,1)----float 大于0且小于1之间的小数 4 5 print(random.randint(1,3) ...

  7. c++面向过程和面向对象-C++编译器是如何管理类和对象的

    1,c++编译时如何区分对象调用类的方法? C++中的class从面向对象理论出发,将变量(属性)和函数(方法)集中定义在一起,用于描述现实世界中的类.从计算机的角度,程序依然由数据段(栈区内存)和代 ...

  8. 源码调用ffmpeg库时,需要注意接口为C接口

    即引用相关头文件时候,要使用extern "C"{}来包含. 关于extern "C"{}的详情,参考:http://www.cnblogs.com/skyne ...

  9. 调用高德地图API(热力图)详解

    具体脚本语言如下: <!doctype html> <html> <head> <meta charset="utf-8"> < ...

  10. MYSQL 插入数据乱码

    1.最近在写电商项目 遇见过向数据库中加入数据乱码问题 最开始以为是,数据库的问题但是一看 没问题啊 于是又看了项目的默认编码,也没问题啊 那么问题来了,在哪出现了问题呢 于是 博主 在 tomact ...