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;
    }
  • 相关阅读:
    C++树状数组详解
    状态码
    java面试教程视频
    学生管理系统学生基本信息查询(1)
    学生管理系统导包
    学生信息管理系统数据库设计
    SSH简单项目
    MyBatis入门
    Struts配置详解
    Struts的使用
  • 原文地址:https://www.cnblogs.com/LM-LBG/p/10617402.html
Copyright © 2011-2022 走看看