1. 程式人生 > >輾轉相減,求最後的a b

輾轉相減,求最後的a b

log 來源 med targe 公式 求解 title head target

來源:codeforces B. Weird Subtraction Process

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





思路:
模擬題目給出的步驟,逐步求解,超時,後來想到預處理ab,預處理不徹底,被hack

總結:
不能魯莽的模擬,一定要考慮到特殊情況,千萬不能因為簡單而大意。這種題目應該分析出公式

#include <bits/stdc++.h>
using namespace std;
long long a,b;
int main()
{
    cin>>a>>b;
    while(a!=0&&b!=0)
    if(a>=2*b)
    {
        a%=(2*b);
    }
    else if(b>=2*a)
    {
        b%=(2*a);
    }
    else break;
    cout<<a<<" "<<b<<endl;
    return 0;
}

輾轉相減,求最後的a b