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;
    }
  • 相关阅读:
    更改ORACLE_HOME_NAME
    Linux 查看裸设备大小
    Linux 日常操作
    Linux 高 wio 分析
    Linux 大页: HugePage 与transparent HugePage
    CentOS 8 配置本地YUM源
    MySQL 表压缩
    HIVE 处理json结构数据
    Emacs org-mode 2 文档结构
    CentOS 7 Oracle 19.3 单实例静默安装
  • 原文地址:https://www.cnblogs.com/LM-LBG/p/10617402.html
Copyright © 2011-2022 走看看