双六问题(扩展欧几里得模板)

来源:互联网 发布:知轩藏书网 编辑:程序博客网 时间:2024/06/08 14:49

题目:一个双六上面有向前向后无限延续的格子,每个格子都写

有整数。其中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;}