hdu2669 欧几里得水题
2013-10-20 22:04
288 查看
题解:显然是用扩展欧几里得定理求解。
又扩展欧几里得定理有,如果a*x+b*y = d 要使得方程有解必有gcd(a,b)为d的约数。
而此题的d = 1 所以若gcd(a,b)!=1,则应该输出sorry
注意,输出的x应为最小的非负整数,这就需要用到x,y所有解的公式:
x,y所有解:
假设d=gcd(a,b). 那么x=x0+b/d*t; y=y0-a/d*t;其中t为任意常整数
又扩展欧几里得定理有,如果a*x+b*y = d 要使得方程有解必有gcd(a,b)为d的约数。
而此题的d = 1 所以若gcd(a,b)!=1,则应该输出sorry
注意,输出的x应为最小的非负整数,这就需要用到x,y所有解的公式:
x,y所有解:
假设d=gcd(a,b). 那么x=x0+b/d*t; y=y0-a/d*t;其中t为任意常整数
#include<iostream> #include<cstdio> using namespace std; int Ex_gcd(int a, int b, int &x, int &y) { if( !b ) { x = 1; y = 0; return a; } int t, d = Ex_gcd(b, a%b, x, y); t = x; x = y; y = t - a / b * y; return d; } int main() { int a, b, x, y, d; while( cin >> a >> b ) { d = Ex_gcd(a, b, x, y); if( d!=1 ) { cout << "sorry" << endl; } else { a /= d; b /= d; while( x<=0 ) { x += b; y -= a; } cout << x << " " << y << endl; } } return 0; }
相关文章推荐
- Java SE——多态续、抽象、接口
- 大学专业学习期望与目标
- 个人推荐的Weka教程,包含了数据格式、数据准备、分类和聚类Demo
- Java自带的性能监测工具用法简介——jstack、jconsole、jinfo、jmap、jdb、jsta、jvisualvm
- Linux Shell 返回值总结
- HDU 2458 最大团个数=顶点数 - 补图最大匹配数 二分匹配
- php查询子字符串位置代码
- 开源企业级监控系统-zabbix(一)
- 收藏
- TEST
- LUA应用程序实例
- ios7 tableview被navigationbar挡住
- WIN8外包公司【经验分享】——升级WIN8.1后VS2012报错解决方法
- C++读入两个参数
- 刚子扯谈:专注 极致 口碑 快
- Servlet总结(一)
- 每日Ubuntu小技巧 —— 禁用Ubuntu的屏幕锁定
- 定价策略-成本加成定价法
- MYSQL-BINLOG
- 分享小容量Nnad Flash替换型号