1 条题解

  • 0
    @ 2025-8-24 21:33:53

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Lyrics
    **

    搬运于2025-08-24 21:33:53,当前版本为作者最后更新于2017-10-08 20:34:27,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    给一个数字对(a,b),考虑如何把它还原成(1,1)

    我们想:

    若a>b那么(a,b)->(a-b,b);

    若b>a那么(a,b)->(a,b-a);

    若a==b

    若(ab1)那么我们就还原成功了!

    否则,(a,b)->(a,0)/(0,b),无法还原到(1,1),不满足条件。

    如何加速这个过程呢?

    我们感觉这个东西和gcd(辗转相除法)很像

    若a>b,则(a,b)->(a mod b,b),步数+a/b;

    若b>a,同理可得。

    对于给定的n,枚举所有的i,还原(n,i),取最小步数为解

    时间复杂度O(n*logn)

    所以,CODE:

    #include<bits/stdc++.h>
    #define LL long long
    #define NAME "numpair"
    #define setfile() freopen(NAME".in","r",stdin),freopen(NAME".out","w",stdout)
    #define closefile() fclose(stdin),fclose(stdout)
    LL inf=1e9,n,ans=1e9;
    using namespace std;
    LL calc(LL a,LL b){
        if (b==1) return a-1;
        if (!b) return inf;
        return a/b+calc(b,a%b);
    }
    int main(){
        setfile();
        scanf("%lld",&n);
        for (int i=1;i<n;i++)
            ans=min(ans,calc(n,i));
        printf("%lld\n",ans);
        closefile();
        return 0;
    }
    
    • 1

    信息

    ID
    1068
    时间
    1000ms
    内存
    125MiB
    难度
    3
    标签
    (无)
    递交数
    0
    已通过
    0
    上传者