POJ 2142 扩展欧几里得
2015-05-30 20:09
344 查看
题意:手中有一个天平 质量分别为a b的砝码和c的物品 砝码两边都可以摆放 求砝码的个数使得天平平衡 (要求使得砝码的数量最小 若有相等的则使总质量最小)
思路:分别求x的最小正整数解和对应的y的值 y的最小正整数解对应的x的值 两组进行比较
思路:分别求x的最小正整数解和对应的y的值 y的最小正整数解对应的x的值 两组进行比较
#include <iostream> #include <cstdio> #include <stdlib.h> using namespace std; typedef long long LL; LL gcd(LL a,LL b) { return b?gcd(b,a%b):a; } void exgcd(LL a,LL b,LL &x,LL &y) { if(b==0) { x=1; y=0; return ; } exgcd(b,a%b,x,y); LL tmp=x; x=y; y=tmp-(a/b)*y; } int main() { LL a,b,w; while(cin>>a>>b>>w) { if(a==0&&b==0&&w==0) break; LL k=gcd(a,b); a/=k; b/=k; w/=k; LL x,y; exgcd(a,b,x,y); x*=w,y*=w; LL x1=(x%b+b)%b,y1=(w-a*x1)/b; LL y2=(y%a+a)%a,x2=(w-b*y2)/a; int sum1=abs(x1)+abs(y1),sum2=abs(x2)+abs(y2); if(sum1<sum2) cout<<abs(x1)<<" "<<abs(y1)<<endl; if(sum1>sum2) cout<<abs(x2)<<" "<<abs(y2)<<endl; if(sum1==sum2) { LL sum_weight1=x1*a+y1*b; LL sum_weight2=x2*a+y2*b; if(sum_weight1<sum_weight2) cout<<abs(x1)<<" "<<abs(y1)<<endl; else cout<<abs(x2)<<" "<<abs(y2)<<endl; } } return 0; }
相关文章推荐
- 技术研究(发明)的途径及其手段概述-1
- c++中友元机制
- Project Euler:Problem 12 Highly divisible triangular number
- Python Template 错误
- jackson的基本使用
- Tunna内网转发
- java日期循环
- android编译错误--/usr/bin/ld: cannot find -lz
- Android SlidingMenu 使用详解
- 基于python的机器学习(一)
- OC视频笔记3.1(Foundation框架,NSObject里面的方法)3.2(isKindOfClass和isMemberOfClass)
- linux下c程序编译过程及GCC,G++, GDB简介
- 图搜索之A*算法、深度优先搜索和广度优先搜索
- CSS权值
- 图搜索之A*算法、深度优先搜索和广度优先搜索
- WCF医院管理系统技术解析(三)体检登记(二)
- nc导出补丁如何查看修改类属于哪个模块
- Intellij IDEA常用配置详解
- 各种机器学习方法概念
- 2015年百度之星程序设计大赛 - 资格赛 1005 下棋