取模也是一样的,就当多减几次.
在欧几里得最初的描述中,商和余数是通过连续的减法来计算的,即从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
You have two variables a and b. Consider the following sequence of actions performed with these variables:
- If a = 0 or b = 0, end the process. Otherwise, go to step 2;
- If a ≥ 2·b, then set the value of a to a - 2·b, and repeat step 1. Otherwise, go to step 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.
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.
Print two integers — the values of a and b after the end of the process.
12 5
0 1
31 12
7 12
Explanations to the samples:
- a = 12, b = 5 a = 2, b = 5 a = 2, b = 1 a = 0, b = 1;
- a = 31, b = 12 a = 7, b = 12.
#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; }