博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Romantic HDU - 2669(扩欧模板题)
阅读量:4966 次
发布时间:2019-06-12

本文共 1730 字,大约阅读时间需要 5 分钟。

扩展欧几里得模板

扩展欧几里德算法——找出一对整数(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
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; } }}

转载于:https://www.cnblogs.com/KeepZ/p/11342116.html

你可能感兴趣的文章
我对应用软件——美团的看法
查看>>
执行了的程序,才是你的程序.
查看>>
struts2.x + Tiles2.x读取多个xml 配置文件
查看>>
表单校验之datatype
查看>>
python第六篇文件处理类型
查看>>
ubuntu16系统磁盘空间/dev/vda1占用满的问题
查看>>
grid网格布局
查看>>
JSP常用标签
查看>>
dashucoding记录2019.6.7
查看>>
九涯的第一次
查看>>
处理器管理与进程调度
查看>>
页面懒加载
查看>>
向量非零元素个数_向量范数详解+代码实现
查看>>
java if 用法详解_Java编程中的条件判断之if语句的用法详解
查看>>
java -f_java学习笔记(一)
查看>>
java 什么题目好做_用java做这些题目
查看>>
java中的合同打印_比较方法违反了Java 7中的一般合同
查看>>
php 位运算与权限,怎么在PHP中使用位运算对网站的权限进行管理
查看>>
matlab sin函数 fft,matlab的fft函数的使用教程
查看>>
wcdma下行如何解扩解扰 matlab,WCDMA技术基础.ppt
查看>>