扩展欧几里得算法
来源:互联网 发布:我的恐怖妻子 知乎 编辑:程序博客网 时间:2024/06/03 18:43
紫书:
求直线ax+by+c=0上的整数点(x,y);
先求ax+by+c=gcd(a,b)的解
void gcd(int a,int b,int &d,int &x,int &y)//d为a,b的最大公因数{ if(!b) { d=a; x=1; y=0; } else { gcd(b,a%b,d,y,x); y-=x*(a/b); }}
若方程的一组解为(x0,y0),则通解为(x0+kb',y0+ka')(a'=a/gcd(a,b),b'=b/gcd(a,b));k为任意整数
例题:
Now tell you two nonnegative integer a and b. Find the nonnegative integer X and integer Y to satisfy X*a + Y*b = 1. If no such answer print "sorry" instead.
Input
The input contains multiple test cases.
Each case two nonnegative integer a,b (0<a, b<=2^31)
Each case two nonnegative integer a,b (0<a, b<=2^31)
Output
output nonnegative integer X and integer Y, if there are more answers than the X smaller one will be choosed. If no answer put "sorry" instead.
Sample Input
77 5110 4434 79
#include<cstdio>#include<iostream>using namespace std;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); }}int main(){ int x,y,a,b,d; while(~scanf("%d%d",&a,&b)) { gcd(a,b,d,x,y); if(d!=1) { printf("sorry\n"); continue; } else { while(x<=0) { x=x+b; y=y-a; } printf("%d %d\n",x,y); } } return 0;}
阅读全文
0 0
- 欧几里得算法&&扩展欧几里得算法
- 欧几里得算法/扩展欧几里得算法
- 欧几里得算法&&扩展欧几里得算法
- 欧几里得、扩展的欧几里得算法
- 欧几里得及欧几里得扩展算法
- 欧几里得、扩展的欧几里得算法 .
- 欧几里得与扩展欧几里得算法
- 欧几里得和扩展欧几里得算法
- 欧几里得和扩展欧几里得算法
- 欧几里得算法及扩展欧几里得
- 欧几里得和扩展欧几里得算法
- 欧几里得, 扩展欧几里得算法模板
- 欧几里得算法及其扩展
- 扩展的欧几里得算法
- 扩展的欧几里得算法
- 欧几里得扩展算法
- 扩展欧几里得算法
- 扩展欧几里得算法
- 2017 Multi-University Training Contest
- 使用redis进行缓存
- Lua 闭包知识点 -- 学习过程笔记,会比较乱
- Vuejs几个小实例
- 责任链模式--Chain of Responsibility Pattern
- 扩展欧几里得算法
- DeprecationWarning: `open()` is deprecated in mongoose >= 4.11.0, use `openUri()` instea
- 【Unity技巧】调整画质(贴图)质量
- poj3579 Median (二分-查找第K大的值)
- docker制作镜像
- 扩展欧拉定理
- Linked Data学习
- JVM高级特性与实践(九):类加载器 与 双亲委派模式(自定义类加载器源码探究ClassLoader)
- 让你快速上手Runtime