双六问题

双六问题

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

有整数。其中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>
using namespace std;
typedef long long LL;

LL extgcd(LL a,LL b,LL &x,LL &y)
{
    if(a==0){
        x=0;y=1;
        return b;
    }
    else{
        LL tx,ty;
        LL d=extgcd(b%a,a,tx,ty);
        x=ty-(b/a)*tx;
        y=tx;
        return d;
    }
}

int main()
{
    LL a,b,x,y;
    scanf("%lld%lld",&a,&b);
    if(extgcd(a,b,x,y)!=1){printf("0\n");return 0;}
    printf("%lld\n",abs(x)+abs(y));
return 0;
}

 

posted @ 2016-01-25 15:30  543~  阅读(536)  评论(0编辑  收藏  举报