zoukankan      html  css  js  c++  java
  • 数字对【数论】

    题目大意:
    对于一个数字对(a,b),可以将其变为新数字对(a+b,b)(a,a+b)
    给定一正整数n,问最少需要多少次操作可将数字对(1,1)变为一个数字对,且该数字对有一个为n。


    思路:
    真的不会做啊。。。
    考试时想了bfsdfsDP,但是都至少是O(n2)的算法,对于n106根本吃不消。
    最后还是打了一个DP灰溜溜的交上去,30分。


    正解:数论,GCD

    有谁看得出这是GCD的题目???
    对于给定的n,我们可以枚举所有的i,模拟还原n,i,最终步数最少的就是最终解。
    这道题可以类比求gcd的辗转相除法。
    a>b,则gcda,b=gcd(amodb,b)
    ab,则gcda,b=(a,bmoda)
    当达到一定次数时,b=1,那么这就是一个合法的解。如果b=0时,b没有等于过1,那么这个解就不合法。


    代码:

    #include <cstdio>
    #include <iostream>
    using namespace std;
    
    int n,ans;
    
    int gcd(int a,int b)  //辗转相除法
    {
        if (!b) return 99999999;  //b到达0且没有等于过1,无解
        if (b==1) return a-1;  //b=1,有借
        return gcd(b,a%b)+a/b; 
    }
    
    int main()
    {
        scanf("%d",&n);
        ans=99999999;
        for (int i=1;i<=(n+1)/2+1;i++)  //简单精简。
         ans=min(ans,gcd(n,i));
        return printf("%d\n",ans)&0;
    }
  • 相关阅读:
    五种IO模型透彻分析
    linux正则表达式
    洛谷P1242 新汉诺塔 【神奇的递归】
    【NOIP2012】疫情控制
    [ZJOI2007]棋盘制作 【最大同色矩形】
    [NOIP2008]双栈排序 【二分图 + 模拟】
    LCA的倍增算法
    最大权闭合子图
    小Z的袜子 题解报告【莫队】
    ZJOI2012网络 题解报告【LCT】
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/9313036.html
Copyright © 2011-2022 走看看