GCD:Greatest Common Divisor.
欧几里德算法(Euclid)阐述了一种求gcd的算法。
//最大公约数 int gcd(int a,int b) { if(b==0) return a; return gcd(b,a%b); } //因为 最小公倍数*最大公约数=a*b //所以 最小公倍数 lcm=a*b/gcd(a,b);
拓展欧几里得算法:
双六问题
题目:一个双六上面有向前向后无限延续的格子,每个格子都写
有整数。其中0号格子是起点,1 号格子是终点。而骰子上只有a,b,-a,-b四个整数,
所以根据a和b的值的不同,有可能无法到达终点。现在的问题是掷出a,b,-a,-b各
多少次可以达到终点呢?
输入:一行,包含两个数 a 和 b,两数之间用一个空格分隔,含义如题目所述。
输出:一个数,表示掷出四个整数次数的和,如果解不唯一,就输出和最小的值,
如果无解则输出 0 。
输入示例:4 11
输出示例:4
数据范围:1<=a,b<=10^9
题解:实际上这个问题可以转化为求 ax+by=1的解
#include <iostream> #include <cstdio> #include <string> #include <algorithm> using namespace std; int gcd(int a,int b) { return b==0?a:gcd(b,a%b); } void ex_gcd(int a,int b,int &x,int &y) { if(b==0) { x=1; y=0; return; } else { ex_gcd(b,a%b,x,y); int t=x; x=y; y=t-(a/b)*y; } } int main () { int a,b; int x,y; while(scanf("%d%d",&a,&b)!=EOF) { ex_gcd(a,b,x,y); if(gcd(a,b)!=1) printf("impossible\n"); else printf("%d %d\n",x,y); } return 0; }