HDU2669 第六周练习I题(扩展欧几里算法)
2015-08-17 17:19
309 查看
第六周练习I题
I - 数论,线性方程
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Description
The Sky is Sprite. The Birds is Fly in the Sky. The Wind is Wonderful. Blew Throw the Trees Trees are Shaking, Leaves are Falling. Lovers Walk passing, and so are You. ................................Write in English class by yifenfei
Girls are clever and bright. In HDU every girl like math. Every girl like to solve math problem! 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)
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 51
10 44
34 79
Sample Output
2 -3
sorry
7 -3
扩展欧几里德算法详解 http://www.cnblogs.com/hfc-xx/p/4744462.html 题解:紫书p313
扩展欧几里得算法是 用来在已知a,b 求解一组x,y使得x*a+y*b=gcd(a,b)
因为已知欧几里得算法gcd(a,b)=gcd(b,a%b) 所以x*a+y*b=gcd(a,b)=gcd(b,a%b)=x*b+y*a%b=x*b+y*(a-a/b*b)=y*a+(x-a/b*y)*b;
注意;a-a/b*b=a%b 这样就将a,b的线性组合化简b为a%b与的线性组合. 根据我的输出图可以看到: a,b都在减小,当b减小到0时, 我们就可以得出x=1,y=0; 然后递归回去就可以求出最终的x,y了
I - 数论,线性方程
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Description
The Sky is Sprite. The Birds is Fly in the Sky. The Wind is Wonderful. Blew Throw the Trees Trees are Shaking, Leaves are Falling. Lovers Walk passing, and so are You. ................................Write in English class by yifenfei
Girls are clever and bright. In HDU every girl like math. Every girl like to solve math problem! 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)
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 51
10 44
34 79
Sample Output
2 -3
sorry
7 -3
扩展欧几里德算法详解 http://www.cnblogs.com/hfc-xx/p/4744462.html 题解:紫书p313
扩展欧几里得算法是 用来在已知a,b 求解一组x,y使得x*a+y*b=gcd(a,b)
因为已知欧几里得算法gcd(a,b)=gcd(b,a%b) 所以x*a+y*b=gcd(a,b)=gcd(b,a%b)=x*b+y*a%b=x*b+y*(a-a/b*b)=y*a+(x-a/b*y)*b;
注意;a-a/b*b=a%b 这样就将a,b的线性组合化简b为a%b与的线性组合. 根据我的输出图可以看到: a,b都在减小,当b减小到0时, 我们就可以得出x=1,y=0; 然后递归回去就可以求出最终的x,y了
#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; // cout<<d<<" "<<x<<" "<<y<<endl; //输出 } else { gcd(b,a%b,d,y,x); // cout<<b<<" "<<a%b<<" "<<d<<" "<<y<<" "<<x<<endl; //输出 y-=a/b*x; // cout<<x<<" "<<y<<endl; //输出 } } int main() { int a,b,d,x,y; while(cin>>a>>b) { gcd(a,b,d,x,y); if(d!=1) cout<<"sorry"<<endl; else { while(x<0) //x不能小于0 x+=b,y-=a; cout<<x<<" "<<y<<endl; } } return 0; }
相关文章推荐
- centos mysql php Curl
- exchange 2016 辅助角色
- hadoop序列文件读与写 (SequenceWriteReadFile)
- mysql数据库存储过程学习
- [转]HTML 中 id与name 区别
- 22.预处理指令2-条件编译
- 电商商品搜索现状
- 畅通工程续
- ssoj1536network
- [HDU 1811] Rank of Tetris 并查集+拓扑
- 推荐两个不错的免费教程
- Easyui combobox如何默认选中第一项???
- SQLite xamarin iOS 本地数据库
- 21.预处理指令1-宏定义
- SQL:外连接on条件与where条件的区别
- TF-IDF与余弦相似性的应用(二):找出相似文章
- mysql 第一个sql优化
- 《互动教程 for Illustrator CC》中文版正式发布
- POJ 3984 迷宫问题
- Maven 下载net.sf.json-lib jar包