取模也是一样的,就当多减几次.

在欧几里得最初的描述中,商和余数是通过连续的减法来计算的,即从rk−2中不断减去rk−1直到小于rk−1。一个更高效的做法是使用整数除法和模除来计算商和余数:

rk rk−2 mod rk−1
在欧几里得定义的减法版本,取余运算被减法替换
while (b!=0)
{
if (a>b)  a=a-b;
else  b=b-a;
}

//结果是a 

 

Educational Codeforces Round 39 (Rated for Div. 2) B. Weird Subtraction Process[数论/欧几里得算法]_c++

B. Weird Subtraction Process
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

You have two variables a and b. Consider the following sequence of actions performed with these variables:

  1. If a = 0 or b = 0, end the process. Otherwise, go to step 2;
  2. If a ≥ 2·b, then set the value of a to a - 2·b, and repeat step 1. Otherwise, go to step 3;
  3. If b ≥ 2·a, then set the value of b to b - 2·a, and repeat step 1. Otherwise, end the process.

Initially the values of a and b are positive integers, and so the process will be finite.

You have to determine the values of a and b after the process ends.

Input

The only line of the input contains two integers n and m (1 ≤ n, m ≤ 1018). n is the initial value of variable a, and m is the initial value of variable b.

Output

Print two integers — the values of a and b after the end of the process.

Examples
input
Copy
12 5
output
0 1
input
Copy
31 12
output
7 12
Note

Explanations to the samples:

  1. a = 12, b = 5 Educational Codeforces Round 39 (Rated for Div. 2) B. Weird Subtraction Process[数论/欧几里得算法]_#define_02 a = 2, b = 5 Educational Codeforces Round 39 (Rated for Div. 2) B. Weird Subtraction Process[数论/欧几里得算法]_#define_02 a = 2, b = 1 Educational Codeforces Round 39 (Rated for Div. 2) B. Weird Subtraction Process[数论/欧几里得算法]_#define_02 a = 0, b = 1;
  2. a = 31, b = 12 Educational Codeforces Round 39 (Rated for Div. 2) B. Weird Subtraction Process[数论/欧几里得算法]_#define_02 a = 7, b = 12.
 
 


[题意]:看算法步骤
[分析]:类似欧几里得算法,取余运算替换减法运算,效率更高
[代码]:
 
Educational Codeforces Round 39 (Rated for Div. 2) B. Weird Subtraction Process[数论/欧几里得算法]_取模_06Educational Codeforces Round 39 (Rated for Div. 2) B. Weird Subtraction Process[数论/欧几里得算法]_欧几里得算法_07
#include<bits/stdc++.h>
using namespace std;
#define z(i) (1<<i)
#define g(x,y) (3*((x-1)/3)+(y-1)/3+1)
#define LL long long
int read()
{
    int _=0,___=1;char __=getchar();
    while(__<'0'||__>'9'){if(__=='-')___=-1;__=getchar();}
    while(__>='0'&&__<='9'){_=_*10+__-'0';__=getchar();}
    return _*___;
}
int main()
{
    LL a,b;
    cin>>a>>b;
    while(a&&b){
        if(a>=2*b) a%=2*b;
        else if(b>=2*a) b%=2*a;
        else break;
    }
    cout<<a<<" "<<b<<endl;
    return 0;
}
View Code