[ZLXOI2015]殉国 数论 扩展欧几里得
2017-07-11 06:27
232 查看
题目大意:已知a,b,c,求满足ax+by=c (x>=0,y>=0)的(x+y)最大值与最小值与解的个数。
直接exgcd,求出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); }
相关文章推荐
- poj 1061 小白算法练习 数论 扩展欧几里得 青蛙的约会
- 数论——扩展欧几里得
- poj 2142 The Balance 数论-扩展欧几里得
- 【数论】【扩展欧几里得】hdu3579 Hello Kiki
- [NWPU][2014][TRN][21]数论入门 B - 扩展欧几里得 POJ 1061
- 数论(欧几里得,扩展欧几里得,欧拉)
- BZOJ_P1407&Codevs_P1747 [NOI2002]Savage(数论+扩展欧几里得)
- POJ 2115 C Looooops [扩展欧几里得]【数论】[水]
- 【数论】扩展欧几里得
- 【数论】【扩展欧几里得】Codeforces 710D Two Arithmetic Progressions
- 数论继续学习4--扩展欧几里得
- 数论学习(2)——欧几里得与扩展欧几里得
- 菜鸡的初入数论(1)——欧几里得与扩展欧几里得小结
- 数论学习之扩展欧几里得
- (Relax 数论1.6)POJ 1061 青蛙的约会(扩展的欧几里得公式)
- ZOJ3609——数论基础 扩展欧几里得求解乘法逆元
- 数论 - 用扩展欧几里得解模线性方程ax≡b (mod n) + 生理周期
- 数论基础(欧几里得,扩展欧几里得,逆元,斯特林)
- 【数论】扩展欧几里得 Ax+By=m 最小的X
- 初步数论-扩展欧几里得&线性同余方程