题目描述
You have two variables
a
a
a and
b
b
b. Consider the following sequence of actions performed with these variables:
- If a = 0 a = 0 a = 0 or b = 0 b = 0 b = 0, end the process. Otherwise, go to step 2 2 2;
- If a ≥ 2 × b a \geq 2 \times b a ≥ 2×b, then set the value of a a a to a − 2 × b a - 2 \times b a − 2×b, and repeat step 1 1 1. Otherwise, go to step 3 3 3;
- If b ≥ 2 × a b \geq 2\times a b ≥2×a, then set the value of b b b to b − 2 × a b - 2\times a b − 2×a, and repeat step 1 1 1. Otherwise, end the process.
Initially the values of
a
a
a and
b
b
b are positive integers, and so the process will be finite.
You have to determine the values of
a
a
a and
b
b
b after the process ends.
输入描述
The only line of the input contains two integers
n
n
n and
m
m
m
(
1
≤
n
,
m
≤
1
0
18
)
(1 \leq n, m \leq 10^{18})
(1 ≤ n, m ≤ 1018).
n
n
n is the initial value of variable
a
a
a, and
m
m
m is the initial value of variable
b
b
b.
输出描述
Print two integers — the values of
a
a
a and
b
b
b after the end of the process.
Input
12 5
Output
0 1
Input
31 12
Output
7 12
思路
答案可以很容易地通过欧几里德算法计算出来,但是所有的减法都会被取模代替。
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
LL n,m;
scanf("%lld%lld",&n,&m);
while(1)
{
if(n==0||m==0) break;
else if(n>=2LL*m) n-=n/(2LL*m)*2LL*m;
else if(m>=2LL*n) m-=m/(2LL*n)*2LL*n;
else break;
}
printf("%lld %lld\n",n,m);
return 0;
}