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); }