双六,可以理解为是 x 轴上无限延展的若干个格子,例如
... -3 -2 -1 0 1 2 3 ...
其中 00 号格子是起点, 11 号格子是终点。
有一个神奇的骰子,上面只有 a,b,−a,−b 四个整数。
每当掷出一个值,是正值则向右移动相应距离的格子,若是负值则向左移动相应的格子。
问是否存在一种投掷的方案,能从 0 号格子走到 1 号格子。
如果能,输出任意一种方案即可。若不能,则输出 −1。
投掷方案由 4 个整数组成,表示 a,b,−a,−b 出现了多少次。
提示
- 本题采用 special judge,输出任意一种合法的方案均可
- 由于没有固定答案,提交详情中的答案一栏为空
输入
- 第一行 22 个整数,分别表示 a,b
- 1≤a,b≤109
输出
- 一行,四个整数,表示分别需要掷出 a,b,−a,−b 多少次
样例 1
输入
4 11
输出
3 0 0 1
#include <bits/stdc++.h>
using namespace std;
int a,b;
void exgcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;
y=0;
return;
}
exgcd(b,a%b,x,y);
int temp=y;
y=x-(a/b)*y;
x=temp;
}
int main()
{
while(cin>>a>>b)
{
int x,y;
if(__gcd(a,b)!=1)
{
cout<<"-1"<<endl;
break;
}
else
{
exgcd(a,b,x,y);
if(x>=0&&y>=0)
cout<<x<<" "<<y<<" 0"<<" 0"<<endl;
if(x<0&&y>=0)
cout<<"0 "<<y<<" "<<abs(x)<<" 0"<<endl;
if(x>=0&&y<0)
cout<<x<<" "<<"0"<<" 0 "<<abs(y)<<endl;
if(x<0&&y<0)
cout<<"0"<<" "<<"0 "<<abs(x)<<" "<<abs(y)<<endl;
}
}
}
拓展拓展欧几里得算法: