zoukankan      html  css  js  c++  java
  • 极值

     已知m、n为整数,且满足下列两个条件:

            ① m、n∈{1,2,…,k},即1≤m,n≤k

            ②(n2-m*n-m2)2=1

    你的任务是:编程由键盘输入正整数k(1≤k≤109),求一组满足上述两个条件的m、n,并且使m2+n2的值最大。例如,从键盘输入k=1995,则输出:m=987   n=1597。

    今天咋遇到这么多奇怪题...

    先数学推导一波,发现m + n,n也能满足上式,因此答案就是一个斐波那契数列,求出<=k的最大的相邻两项即可

    复杂度O(logk)

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cstdlib>
    #include<ctime>
    using namespace std;
    inline int read()
    {
        int ans = 0,op = 1;
        char ch = getchar();
        while(ch < '0' || ch > '9')
        {
            if(ch == '-') op = -1;
            ch = getchar();
        }
        while(ch >= '0' && ch <= '9')
        {
            (ans *= 10) += ch - '0';
            ch = getchar();
        }
        return ans * op;
    }
    typedef int mainint;
    #define int long long 
    int a,b,c,k;
    mainint main()
    {
        k = read();
        a = b  = 1;
        c = a + b;
        while(c < k)
            a = b,b = c,c = a + b;
        cout << "m=" << a << endl << "n=" << b;
    }
  • 相关阅读:
    札记:计算机网络篇:物理层
    vs2012 它已停止工作
    php laravel 帧 该文件上传
    2016第一周日
    2015年第1周六
    2016第1周五优化自己
    2016值得关注的语言平台、JS框架
    JS模块化规范CommonJS,AMD,CMD
    2016第1周二
    ReactJS入门教程
  • 原文地址:https://www.cnblogs.com/LM-LBG/p/10617402.html
Copyright © 2011-2022 走看看