标签:
1 欧几里得算法标准代码
这个代码算的是符合a * x + b * y = gcd(a, b)的一组x, y, 同时返回了gcd(a, b)
因为a * x1 + b * y1 = gcd(a, b)
gcd(a, b) = gcd(b, a % b)
那么a * x1 + b * y1 = gcd(b, a % b) = b * x2 + (a - a/b*b) * y2; // a % b = a - a/b*b;
__int64 exGcd(__int64 a,__int64 b,__int64 &x,__int64 &y) { if(b==0){ x=1; y=0; return a; } __int64 g=exGcd(b,a%b,x,y); __int64 temp=x; x=y; y=temp-(a/b)*y; return g; }
2求 a * x + b * y = c的解
就是根据上面模板算出gcd(a, b)的同时算出a * x + b * y = gcd(a, b)的解,
然后x = x * c / gcd(a, b); y = y * c / gcd(a, b);
#include <cstdio> __int64 exGcd(__int64 a,__int64 b,__int64 &x,__int64 &y) { if(b==0){ x=1; y=0; return a; } __int64 g=exGcd(b,a%b,x,y); __int64 temp=x; x=y; y=temp-(a/b)*y; return g; } int main() { __int64 a, b, c, x, y, gc; while(scanf("%I64d%I64d%I64d", &a, &b, &c) == 3) { gc = exGcd(a, b, x, y); if(c % gc) { printf("无解\n"); continue; } else printf("%I64d %I64d\n", x*c/gc, y*c/gc); } }
标签:
原文地址:http://www.cnblogs.com/rain-1/p/4780486.html