• Educational Codeforces Round 39 Editorial B(Euclid算法,连续-=与%=的效率)


    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 = 12b = 5  a = 2b = 5  a = 2b = 1  a = 0b = 1;
    2. a = 31b = 12  a = 7b = 12.

    官方题解:

    The answer can be calculated very easy by Euclid algorithm (which is described in the problem statement), but all subtractions will be replaced by taking by modulo.

    题意:

    Euclid算法,和题意一样,我最开始是按照题目给的流程按部就班的写,a,b的范围为10^18,要开long long,但是在text3 10^18 7就TLE了。

    于是后面看到大佬的代码,以及官方题解,发现-=的话,效率会很低,改成%=即可。

    代码:

    #include<bits/stdc++.h>
    
    long long a, b; 
    int main(){
    
    	scanf("%lld %lld", &a, &b);
    	while(a && b){
    		if(a>=2*b) a%= 2*b;
    		else if(b>=2*a) b%=2*a;
    		else break;
    	}
    	printf("%lld %lld", a, b);
    }


  • 相关阅读:
    在某个点上弹出层
    根据表名、过程名、视图名查找对应的数据库
    js时间转换nan问题 兼容浏览器
    过滤html标记 以及 返回顶部
    自定义控件 加入include 报错 问题
    在有索引视图的表上新增、修改、删除 报错 set ARITHABORT 选项不对
    访微博代码
    兼容问题 链接不跳转
    js上下滚动代码
    onload问题
  • 原文地址:https://www.cnblogs.com/wrjlinkkkkkk/p/9552019.html
Copyright © 2020-2023  润新知