poj 2142 The Balance 扩展欧几里得
2016-10-10 23:18
295 查看
POJ2142
题目的大意是通过放不同的砝码使得天枰平衡
很容易得到实际上问题就是解ax=d+by与ax+d=by这两个方程的满足条件的最小的正整数解
但实际上我们可以通过解这样一个不定方程ax+by=d来得到结果
首先,x,y的正负是无关紧要的(如果其中一个是负数,我们直接取绝对值就可以),无非就是砝码从一段移到另一端。
其次,通过扩展欧几里得算法我们能够得到上面不定方程的一个解,但是如何达到满足题意的解:
分别取x的最小整数解(x%b+b)%b,之后计算y,如果为负数,调整为正,是第一种理想情况
同样,区y的最小整数解(y%a+a)%a,之后计算x,如果为负数,调整为正,是第二种理想情况
比较这两种情况那个更优即可得到符合条件的解
AC代码:
题目的大意是通过放不同的砝码使得天枰平衡
很容易得到实际上问题就是解ax=d+by与ax+d=by这两个方程的满足条件的最小的正整数解
但实际上我们可以通过解这样一个不定方程ax+by=d来得到结果
首先,x,y的正负是无关紧要的(如果其中一个是负数,我们直接取绝对值就可以),无非就是砝码从一段移到另一端。
其次,通过扩展欧几里得算法我们能够得到上面不定方程的一个解,但是如何达到满足题意的解:
分别取x的最小整数解(x%b+b)%b,之后计算y,如果为负数,调整为正,是第一种理想情况
同样,区y的最小整数解(y%a+a)%a,之后计算x,如果为负数,调整为正,是第二种理想情况
比较这两种情况那个更优即可得到符合条件的解
AC代码:
#include <iostream> #include <cstdio> using namespace std; int a,b,d,x,y; int ex_gcd(int a,int b,int &x,int &y){ if(a==0 && b==0) return -1; if(b==0){ x=1;y=0;return a; } int d=ex_gcd(b,a%b,y,x); y-=a/b*x; return d; } int gcd(int a,int b){ return b==0 ? a : gcd(b,a%b); } int main(){ //freopen("input.txt","r",stdin); while(~scanf("%d%d%d",&a,&b,&d)){ int ans; if(a==0 && b==0 && d==0) break; int r=gcd(a,b); a=a/r;b=b/r;d=d/r; int s=ex_gcd(a,b,x,y); int x1=x*d; x1=(x1%b+b)%b; int y1=(d-a*x1)/b; if(y1<0) y1=-y1; //cout<<x1<<" "<<y1<<endl; int y2=y*d; y2=(y2%a+a)%a; int x2=(d-b*y2)/a; if(x2<0) x2=-x2; if(x1+y1<x2+y2) cout<<x1<<" "<<y1<<endl; else cout<<x2<<" "<<y2<<endl; } return 0; }
相关文章推荐
- POJ 2142 The Balance 扩展欧几里得,求|x|+|y|最小
- poj 2142 The Balance 数论-扩展欧几里得
- POJ 2142:The Balance_扩展欧几里得(多组解)
- poj 2142 The Balance(扩展欧几里得)
- POJ 2142:The Balance_扩展欧几里得
- poj 2142 The Balance 扩展欧几里得
- POJ - 2142 The Balance(扩展欧几里得求解不定方程)
- POJ-2142-The Balance(扩展欧几里得)
- POJ2142_The Balance_扩展欧几里得
- poj 2142 The Balance (基础扩展欧几里得)
- poj 2142 The Balance 扩展欧几里得
- POJ 2142:The Balance_扩展欧几里得
- POJ 2142 - The Balance [ 扩展欧几里得 ]
- POJ 2142 The Balance 求|x|+|y|最小(扩展欧几里得)
- poj 2142 The Balance (扩展欧几里得 数学)
- [POJ 2142]The Balance(扩展欧几里得)
- 扩展欧几里得 Poj2142
- poj 2142 扩展欧几里得解ax+by=c
- poj_2142_欧几里得扩展解延伸_理解过程紧张刺激
- POJ 2142 The Balance (扩展欧几里德)