题目:一个双六上面有向前向后无限延续的格子,每个格子都写
有整数。其中0号格子是起点,1 号格子是终点。而骰子上只有a,b,-a,-b四个整数,
所以根据a和b的值的不同,有可能无法到达终点。现在的问题是掷出a,b,-a,-b各
多少次可以达到终点呢?
输入:一行,包含两个数 a 和 b,两数之间用一个空格分隔,含义如题目所述。
输出:一个数,表示掷出四个整数次数的和,如果解不唯一,就输出和最小的值,
如果无解则输出 0 。
输入示例:4 11
输出示例:4
数据范围:1<=a,b<=10^9
题解:这个问题其实就是一道裸的扩展欧几里得算法,翻译过来就是求整数x、y使得ax+by=1
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int ex_Gcd(int a,int b,int &x,int &y){
if(b == 0){
x = 1;
y = 0;
return a;
}
else{
int r = ex_Gcd(b,a%b,x,y);
int t = x;
x = y;
y = t - (a/b)*y;
return r;
}
}
int main(){
int a,b,x,y;
while(scanf("%d%d",&a,&b)!=EOF){
if(ex_Gcd(a,b,x,y)!=1)
printf("0\n");
else
printf("%d\n",abs(x)+abs(y));
}
return 0;
}