【POJ】2142 The Balance 数论(扩展欧几里得算法)
2018-01-19 14:54
369 查看
【题意】给定a,b,c,在天平左边放置若干重量a的砝码,在天平右边放置若干重量b的砝码,使得天平两端砝码差为c。设放置x个A砝码和y个B砝码,求x+y的最小值。
【算法】数论(扩展欧几里德算法)
【题解】问题转化为求满足方程ax+by=c,|x|+|y|的最小值。
先用扩展欧几里得算法求得通解。
由原方程得答案分布在y=-a/b*x+c/b(a>0,b>0,c>0),因此是k<0,b>0的直线。
由于斜率一定,min{|x|+|y|}一定出现在x轴两侧或y轴两侧,取这四个点判断一下即可。
#include<cstdio> int ansx,ansy,ans; int gcd(int a,int b){return !b?a:gcd(b,a%b);} void exgcd(int a,int b,int &x,int &y){ if(!b){x=1;y=0;}else{exgcd(b,a%b,y,x);y-=x*(a/b);} } void s(int x,int y){ if(x<0)x=-x;if(y<0)y=-y; if(x+y<ans){ ans=x+y; ansx=x;ansy=y; } } int main(){ int a,b,c; scanf("%d%d%d",&a,&b,&c); while(a||b||c){ int g=gcd(a,b),x,y,X,Y; a/=g;b/=g;c/=g; exgcd(a,b,x,y); ans=0x3f3f3f3f; X=(x*c%b+b)%b;Y=(c*g-a*g*X)/(b*g);s(X,Y); X-=b;Y+=a;s(X,Y); Y=(y*c%a+a)%a;X=(c*g-b*g*Y)/(a*g);s(X,Y); Y-=b;X+=a;s(X,Y); printf("%d %d\n",ansx,ansy); scanf("%d%d%d",&a,&b,&c); } return 0; }View Code
由于此题数据比较弱,所以网上很多题解都是最小非负x和y,反例:1 10 29。
相关文章推荐
- POJ 2142 The Balance [不定方程和最小的正整数解]【数论】
- poj 2142 The Balance 数论-扩展欧几里得
- poj2142 The Balance(扩展欧几里得算法)
- POJ2142 The Balance(扩展欧几里得算法)
- poj 2142 The Balance (扩展欧几里得算法)
- POJ2142 The Balance (扩展欧几里德)
- POJ2142——The Balance
- poj 2142 The Balance (扩展欧几里得 数学)
- poj 2142 The Balance 扩展欧几里得
- POJ 2142 - The Balance [ 扩展欧几里得 ]
- [数论]POJ 2115/HOJ 1787 C Looooops 扩展欧几里得算法
- poj2142-The Balance(扩展欧几里德算法)
- POJ 2142:The Balance_扩展欧几里得
- POJ 2142 The balance | EXGCD
- POJ 2142 : The Balance-解不定方程,一元线性同余
- poj2142 The Balance 扩展欧几里德的应用 稍微还是有点难度的
- POJ 2142 The Balance .
- POJ 2142 The Balance 解题报告(模线性方程)
- poj2142 The Balance
- poj2142 The Balance