导航

双六

Posted on 2016-01-26 10:15  POOH1DROSE  阅读(701)  评论(0编辑  收藏  举报

2016.1.26

 

试题描述

一个双六上面有向前向后无限延续的格子(如下图所示),每个格子都写有整数。其中0号格子是起点,1 号格子是终点。而骰子上只有a,b,-a,-b四个整数,所以根据a和b的值的不同,有可能无法到达终点。现在的问题是掷出a,b,-a,-b各多少次可以达到终点呢?(双六是类似大富翁的一款桌上游戏,不懂也没关系的啦)
         

输入
一行,包含两个数 a 和 b,两数之间用一个空格分隔,含义如题目所述。
输出
一个数,表示掷出四个整数次数的和,如果解不唯一,就输出和最小的值,如果无解则输出 0 。
输入示例
4 11
输出示例
4
其他说明
数据范围:1≤a,b≤10的9次方。
样例解释:掷出a为3次,b为0次,-a为0次,-b为1次, 3*a-l*b=l。 

 

扩展欧几里得= =注意判负和不成立的情况

#include<iostream>
using namespace std;
int extgcd(int a,int b,int &x,int &y)
{
    if(!b)
    {
        x=1;y=0;
        return a;
    }
    else
    {
        int temp=extgcd(b,a%b,y,x);
        y-=(a/b)*x;
        return temp;
    }
}
int main()
{
    int a,b,x,y;
    scanf("%d%d",&a,&b);
    if(b>a) swap(a,b);
    int temp=extgcd(a,b,x,y);
    if(x<0) x=-x;if(y<0) y=-y;
    if(temp!=1) printf("0");
    else printf("%d",x+y);

}
View Code