题目大意:已知a,b,c,求满足ax+by=c (x>=0,y>=0)的(x+y)最大值与最小值与解的个数。

直接exgcd,求出x,y分别为最小正整数的解,然后一算就出来啦

#include<cstdio>
#include<iostream>
#define ll long long
using namespace std;
ll a,b,c,x,y,d,bd,ad,X1,Y1,X2,Y2;
ll Abs(ll x){
return x>=0?x:-x;
}
ll exgcd(ll a,ll b,ll &x,ll &y){
if(b==0){
x=1; y=0;
return a;
}
int gcd=exgcd(b,a%b,x,y);
int t=x;
x=y;
y=t-(a/b)*x;
return gcd;
}
int main()
{
//freopen("BlackHawk.in","r",stdin);
//freopen("BlackHawk.out","w",stdout);
scanf("%lld%lld%lld",&a,&b,&c);
d=exgcd(a,b,x,y);
//printf("%lld\n",d);
if(c%d!=0){
printf("-1 -1\n0\n");
return 0;
}
x*=c/d; y*=c/d;
//printf("%lld %lld\n",x,y);
bd=b/d; ad=a/d;
X1=(x%bd+bd)%bd;
ll t=(X1-x)/bd;
Y1=y-t*ad;
ll num1=X1+Y1;
//printf("%lld %lld\n",X1,Y1);
if(Y1<0){
printf("-1 -1\n0\n");
return 0;
}
Y2=(y%ad+ad)%ad;
t=(Y2-y)/ad;
X2=x-t*bd;
ll num2=X2+Y2;
//printf("%lld %lld\n",X2,Y2);
if(X2<0){
printf("-1 -1\n0\n");
return 0;
}
if(num2<num1){t=num1; num1=num2; num2=t;}
printf("%lld %lld\n",num1,num2);
t=Abs((X1-X2)/bd)+1;
printf("%lld\n",t);
}

最新文章

  1. BZOJ3346 : Ural1811 Dual Sim Phone
  2. PHP基础班初学心得:关于网页创作
  3. OpenSuSE zypper OpenStack Icehouse repoAdd
  4. suse linux11 包括所有的linux操作系统的 遗忘root密码解决方案
  5. 用VsCode编辑TypeScript
  6. 读书共享 Primer Plus C-part 8
  7. webserver apache 2.2.22-7/ apache webdav / redhat 6.3
  8. devstack 部署 openstack(pick/mitaka)
  9. addEventListener在一个节点上添加多个相同的事件
  10. node 慕课笔记
  11. MySql详解(一)
  12. Visual studio 2013 安装的漫长过程
  13. Elasticsearch学习之SearchRequestBuilder常用方法说明
  14. angular2.0---服务Service,使用服务进行数据处理
  15. Centos7.0安装KVM实践
  16. 嵌入式C语言自我修养 11:有一种函数,叫内建函数
  17. 20164324王启元 Exp4恶意代码分析
  18. 修改eclipse下tomcat的内存大小/解决内存溢出
  19. 纯CSS实现轮播图效果,你不知道的CSS3黑科技
  20. easyui 刷新页面

热门文章

  1. Spring Cloud项目中通过Feign进行内部服务调用发生401\407错误无返回信息的问题
  2. angular中的jqLite的基本使用方法
  3. Next Permutation 下一个排列
  4. javaScript(1)---概述
  5. for循环嵌套讲解:
  6. Hibernate的二级缓存策略
  7. spring3.1文档目录翻译
  8. InnoDB的4个特性
  9. Lintcode395 Coins in a Line II solution 题解
  10. 洛谷 P1057 解题报告