CodeForces - 898B(拓展欧几里得)
就是求a*x+b*y=c,但是x和y必须是非负的,写了这么长时间,板子忘了,相当于重学一遍拓展欧几里得,这里付一位大佬的博客(最近准备考试,但不敲题是真的不行,全都忘了。)https://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> using namespace std; typedef long long int ll; ll ex_gcd(ll a,ll b,ll &x,ll &y) { if(b==0) { x=1; y=0; return a; } ll r=ex_gcd(b,a%b,x,y); ll t=x; x=y; y=t-a/b*y; return r; } bool jie(ll a,ll b,ll c,ll &x,ll &y) { ll r=ex_gcd(a,b,x,y); if(c%r!=0) return 0; ll zz=c/r; x*=zz; y*=zz; if(x<0&&y<0) return 0; ll bb=b/r; ll aa=a/r; if(x<0&&y>0) { ll t=-1*x/bb; if(x+bb*t<0) t++; x=x+bb*t; y=y-aa*t; if(y>=0) return 1; else return 0; } else if(x>0&&y<0) { ll t=y/aa; if(y-aa*t<0) t--; x=x+bb*t; y=y-aa*t; if(x>=0) return 1; else return 0; } return 1; } ll a,b,c,x,y; int main() { while(~scanf("%lld%lld%lld",&c,&a,&b)) { x=0; y=0; if(jie(a,b,c,x,y)) { printf("YES\n"); printf("%lld %lld\n",x,y); } else { printf("NO\n"); } } return 0; }