POJ2142——The Balance

刚学习的扩展欧几里得算法,刷个水题

求解  线性不定方程 和  模线性方程

求方程 ax+by=c 或 ax≡c (mod b) 的整数解

1、ax+by=gcd(a,b)的一个整数解:

<span style="font-size:14px;">void ex_gcd(int a,int b,int &d,int &x,int &y)//扩展欧几里得算法
{
    if(!b){d=a;x=1;y=0;}
    else {ex_gcd(b,a%b,d,y,x);y-=x*(a/b);}
}</span>

2、ax+by=c的所有整数解:

方程两边同时乘以g/c(g为a,b的最大公约数),则原方程为  g *a/c *x+g*b/c*y=g

则g*x/c=x0,g*y/c=y0         (  x0,y0为 方程ax+by=gcd(a,b)的一个特解)

所以原方程的一个特解x=x0*c/g,y=y0*c/g

求通解的过程省略。。。

最后通解为 (x+kb1,y-ka1)   b1=b/g,a1=a/g;

3、ax≡c (mod b)方程的所有整数解:

ax和c关于模b同余,则(ax-c)是b的整数倍,设倍数为y,则原方程等价于 ax-c=by,移项得 ax-by=c,转变为求解ax+by=c的形式

如果两个数的最大公约数为1,则两个数互质

题目分析:

给定 a b k找到满足ax+by=k 的令|x|+|y|最小(等时令a|x|+b|y|最小)不妨a 〉b

先用扩展欧几里得算法求出 一组解 x0,y0,通解可以表示为x=x0+b/d *t y=y0-a/d *t

|x|+|y|=|x0+b/d *t |+|y0-a/d *t| 这个关于t的函数的最小值在  t  =  y0*d/a  附近的两整点里取。故直接验证这两点即可。

因为   设a>b之后

|x0+b/d *t| 单调递增,|y0-a/d*t| 先递减再递增。因斜率a/d>b/d,所以总的|x0+b/d *t |+|y0-a/d *t| 先递减再递增,使y0-a/d*t0=0 的t0附近有最小值。

//转载

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int x0,z1,a1,b1;
void ex_gcd(int a,int b,int &d,int &x,int &y)
{
    if(!b){d=a;x=1;y=0;}
    else {ex_gcd(b,a%b,d,y,x);y-=x*(a/b);}
}
int calx(int k)
{
    return abs(x0+k*b1);
}
int caly(int k)
{
    return abs(z1-k*a1);
}
int main()
{
    int a,b,c;
    while(~scanf("%d%d%d",&a,&b,&c)&&(a||b||c)){
        int flag=1;
        if(a<b) {flag=0;swap(a,b);}
        int d,x,y,k,k1,k2;
        ex_gcd(a,b,d,x,y);
        x0=x*(c/d),z1=y*(c/d);
        a1=a/d,b1=b/d,k1=z1/a1;
        if(k1*a1-z1>=0) k1--;
        k2=k1+1;
        if(calx(k1)+caly(k1)>calx(k2)+caly(k2)) k=k2;
        else if(calx(k1)+caly(k1)<calx(k2)+caly(k2)) k=k1;
        else{
            if(calx(k1)*a+caly(k1)*b>calx(k2)*a+caly(k2)*b) k=k2;
            else k=k1;
        }
        int ansx=calx(k);
        int ansy=caly(k);
        if(!flag){
            printf("%d %d\n",ansy,ansx);
        }
        else printf("%d %d\n",ansx,ansy);
    }

    return 0;
}

POJ2142——The Balance,布布扣,bubuko.com

时间: 2024-10-06 19:56:32

POJ2142——The Balance的相关文章

POJ2142 The Balance (扩展欧几里德)

本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia The Balance 题目大意  你有一个天平(天平左右两边都可以放砝码)与重量为a,b(1<=a,b<=10000)的两种砝码.让你求出一种方案称出重为c(1<=c<=50000)的物品,如有多种方案,请输出两种砝码需要数量的总和最小的方案. 输入 有若干行,每行三个数,a,b,c. 结束时用0 0 0表示. 输出 若干行,每行两个数,表示每个询问中a的数量与b的数量 如果无解输出 

POJ2142 The Balance【二元一次方程】

题目链接: http://poj.org/problem?id=2142 题目大意: 有一个天平,还有质量为a和质量为b的砝码,砝码的数量不限且天平左右两端均可放砝码,现在要求 在天平上惩处质量为c的物品.那么问题来了:怎样放置砝码,才能使放置的砝码数量尽可能的少:当 砝码数量相同时,总质量尽可能的少. 思路: 假设放置x个质量为a的砝码和y个质量为b的砝码,题目就变为了求解a*x + b*y = c的其中一组解,使 得|x| + |y|尽可能小,若相等,则a|x| + b|y|尽可能小.设d

LB(Load balance)负载均衡集群--{LVS-[NAT+DR]单实例实验+LVS+keeplived实验} 菜鸟入门级

LB(Load balance)负载均衡集群 LVS-[NAT+DR]单实例实验 LVS+keeplived实验 LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统. 逻辑可分为: 1调度层 (Director):它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的. 2[服务器池(server pool)/集群层(Real server)]:是一组真正执行客

轻量级网络流量转发工具 - Balance

Balance是一款具有负载均衡和故障转移功能的TCP代理软件.支持IPV6地址的监听和转发,支持rr轮询和ip hash. 某些功能可以替代iptables,比如讲来自本地的80端口转发到8080上: iptables是这样写的: iptables -t nat -A PREROUTING -d 192.168.1.1 -p tcp --dport 80 -j DNAT --to 192.168.1.1:8080 balance只需要这样: balance 80 localhost:8080

益计算Shprotification.v6.8.15.22+Heat.Balance.v6.12.27.36+Cold.Balance.v2.6.14.18

热增益计算Shprotification.v6.8.15.22+Heat.Balance.v6.12.27.36+Cold.Balance.v2.6.14.18 Andrey.Shirshov.Shprotification.v6.8.15.22 Andrey.Shirshov.Heat.Balance.v6.12.27.36 Andrey.Shirshov.Cold.Balance.v2.6.14.18   "现代ASHRAE标准参考数据用于从人.设备.确定热输入的人工照明,半透明的击剑系数(

POJ 2142 The Balance

The Balance Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 6325   Accepted: 2787 Description Ms. Iyo Kiffa-Australis has a balance and only two kinds of weights to measure a dose of medicine. For example, to measure 200mg of aspirin usi

Oracle RAC 服务器端连接负载均衡(Load Balance)

Oracle RAC服务器端的负载均衡是根据RAC中各节点的连接负荷数情况,将新的连接请求分配到负荷最小的节点上去.当数据库处于运行时,RAC中各节点的PMON进程每3秒会将各自节点的连接负荷数更新到service_register.而对于节点中任意监听器故障或监听器意外失败时,PMON进程会每1秒钟检查当前节点上的监听是否重启,以获得最新的负载信息来及时调整负载均衡.本文主要演示suse 10 + oracle 10g rac下的服务器端的负载均衡. 有关客户端的负载均衡可参考      Or

uva 673 Parentheses Balance

Parentheses Balance You are given a string consisting of parentheses () and []. A string of this type is said to be correct: (a)if it is the empty string (b)if A and B are correct, AB is correct, (c)if A is correct, (A) and [A] is correct. Write a pr

How to manage and balance “Huge Data Load” for Big Kafka Clusters---reference

1. Add Partition Tool Partitions act as unit of parallelism. Messages of a single topic are distributed to multiple partitions that can be stored and served on different servers. Upon creation of a topic, the number of partitions for this topic has t