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