Romantic HDU - 2669(扩欧)
扩展欧几里得模板
扩展欧几里德算法——找出一对整数(x,y), 使得ax+by = gcd(a,b)。 注意, 这里的x和y不一定是正数, 也可能是负数或者0。 例如, gcd(6,15)=3, 6*3-15*1=3, 其中x=3, y=-1。 这个方程还有其他解, 如x=-2, y=1。
void gcd(int a, int b, int& d, int &x, int &y)
{
if(!b)
{
d = a;
x = 1;
y = 0;
}
else
{
gcd(b, a % b, d, y, x);
y -= x * (a / b);
}
}
用数学归纳法并不难证明该算法的正确性, 此处略去。 注意在递归调用时, x和y的顺序变
了, 而边界也是不难得出的: gcd(a,0)=1⋅a-0*0=a。 这样, 唯一需要记忆的是y-=x*(a/b), 哪
怕暂时不懂得其中的原因也不要紧。
上面求出了ax+by=gcd(a,b)的一组解(x1,y1), 那么其他解呢? 任取另外一组解(x2,y2),
则ax1+by1=ax2+by2( 它们都等于gcd(a,b)) , 变形得a(x1-x2)=b(y2-y1)。 假设gcd(a,b)=g, 方程
左右两边同时除以g, 得a'(x1-x2)=b' (y2-y1), 其中a'=a/g, b'=b/g。 注意, 此时a'和b'互素,
因此x1-x2一定是b'的整数倍。 设它为kb', 计算得y2-y1=ka'。 注意, 上面的推导过程并没有用
到“ax+by的右边是什么”, 因此得出如下结论。
即:设a, b, c为任意整数。 若方程ax+by=c的一组整数解为(x0,y0), 则它的任
意整数解都可以写成(x0+kb', y0-ka'), 其中a'=a/gcd(a,b), b'=b/gcd(a,b), k取任意整数。
以上内容均参考自刘汝佳的《算法竞赛入门经典》
题目代码及讲解
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
void gcd(LL a, LL b, LL &d, LL &x, LL &y)
{
if(!b)
{
d = a;
x = 1;
y = 0;
}
else
{
gcd(b, a % b, d, y, x);
y -= x * (a / b);
}
}
int main()
{
std::ios::sync_with_stdio(false);
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
LL a, b;
LL x, y;
while(cin >> a >> b)
{
LL x, y, d;
gcd(a, b, d, x, y); //在这里产生一组解
if(d != 1) //要满足题目所给的等式,就必须要求a, b的最大公约数为1
cout << "sorry" << endl;
else
{
while(x < 0)
{
x += b / 1; //它的任意整数解都可以写成(x0+kb', y0-ka'),直到x不为负数为止
y -= a / 1;
}
cout << x << " " << y << endl;
}
}
}
Romantic HDU - 2669(扩欧)的更多相关文章
- hdu 2669(扩展欧几里得)
Romantic Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- hdu 2669 扩展欧几里得(裸)
#include<stdio.h> #include<iostream> #define ll __int64 ll gcd(ll a,ll b,ll &x,ll &a ...
- hdu 2669 Romantic
Romantic Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Sta ...
- 【POJ】2115 C Looooops(扩欧)
Description A Compiler Mystery: We are given a C-language style for loop of type for (variable = A; ...
- 洛谷P4774 [NOI2018]屠龙勇士 [扩欧,中国剩余定理]
传送门 思路 首先可以发现打每条龙的攻击值显然是可以提前算出来的,拿multiset模拟一下即可. 一般情况 可以搞出这么一些式子: \[ atk_i\times x=a_i(\text{mod}\ ...
- 【洛谷】【扩欧】P1516 青蛙的约会
[题目描述] 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有 ...
- 欧几里得(辗转相除gcd)、扩欧(exgcd)、中国剩余定理(crt)、扩展中国剩余定理(excrt)简要介绍
1.欧几里得算法(辗转相除法) 直接上gcd和lcm代码. int gcd(int x,int y){ ?x:gcd(y,x%y); } int lcm(int x,int y){ return x* ...
- CF1182F Maximum Sine【类欧,扩欧】
题目链接:洛谷 题目描述:求整数$x\in [a,b]$使得$|2px \ mod \ 2q-q|$最小,如果有多个$x$输出最小的. 数据范围:$1\leq a,b,p,q\leq 10^9$ 第一 ...
- HDU 2669 Romantic (扩展欧几里得定理)
Romantic Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
随机推荐
- Maven打包成Jar文件时依赖包的问题
我们项目中使用到第三方的库文件,这些jar库文件并没有放到Maven中央库上,导致我们需要在项目中自己配置使用.我们的两三个开发人员对Java都是很熟,因此在使用中遇到了一些问题,表现在:在本地中引入 ...
- 关于Keepalive的那些事
服务端很多同学包括自己对keepalive理解不清晰,经常搞不清楚,TCP也有keepalive,HTTP也有keepalive,高可用也叫keepalive,经常混淆这几个概念.做下这几个概念的简述 ...
- c++学习书籍推荐《C++编程思想第二卷》下载
百度云及其他网盘下载地址:点我 编辑推荐 <C++编程思想>(第2卷)是惟一一本如此清晰地阐述如何重新思考以面向对象方法构造程序的书籍.<C++编程思想>(第2卷)介绍实用的编 ...
- solidity智能合约如何判断地址为0或空
智能合约地址判断 在旧版本中可使用以下代码来进行比较: owner != 0x0 但如果在新版本中使用,则会提示错误信息. 那么,如何正确使用来比较地址是否为空呢. 解决方案 可以使用address( ...
- idea下maven命令打包不同配置
1. 场景描述 不知道大家有没有遇到过?Idea集成的maven,在切换不同环境配置的时候,有时候反应很慢,还存在切换后打包还是原配置的情况. 2. 问题解决 通过在idea下执行maven命令进行切 ...
- linux 安装命令 nginx 部署
[TOC] # 安装anocanda wget https://repo.anaconda.com/archive/Anaconda3-2019.03-Linux-x86_64.sh安装:bash A ...
- c++小游戏:洛谷彩票
#include <cstdlib> #include <iostream> #include <cstdio> #include <cmath> #i ...
- backbone之路由锚点的替换
1.需求 由于项目一开始做的时候不甚完善,所有的网页没有路由功能,导致一些搜索结果在页面跳转之后,没有被记录下来,在页面跳转之后回退,得到的是页面最原始的结果,没有指定的搜索条件.最近项目的在完善这些 ...
- Excel催化剂开源第25波-Excel调用百度AI,返回AI结果
现成的这些轮子,无需调用网页,直接本地离线即可生成). 当然在AI时代,少不了各种AI接口的使用场景,普通开发者只需聚焦在自己的业务场景上,这些AI底层技术,只需类似水煤电一般去BAT这些大厂那里去消 ...
- Java NIO学习系列五:I/O模型
前面总结了很多IO.NIO相关的基础知识点,还总结了IO和NIO之间的区别及各自适用场景,本文会从另一个视角来学习一下IO,即IO模型.什么是IO模型?对于不同人.在不同场景下给出的答案是不同的,所以 ...