考试整理

T2_极值问题

Description

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

(1)m、n∈1,2,3,……,k 
(2)(n^2-mn-m^2)^2=1 

对给定的k,求m^2+n^2的最大值 

Sample Input 

1995 

Sample Output 

m=987 

n=1597

打表找规律好评(大雾

但是肯定是有证明的吗(要不然大佬们怎么做啊qwq

由条件2:(n2-mn-m2)2=1

故而:      (m2 + mn- n2)2=1

继续化简:m2+mn-n2=(m+n)2-mn-2n2 

                                                =(m+n)2-(m+n)n-n2 
即:          (n2-mn-m2)2=[(m+n)2-(m+n)n-n2]2

我们观察上述最后的等式,我们可以发现

n->m+n (第一个平方)

m->n,n->m+n(中间的因式)

m->n(第二个平方)

这时我们发现这是我们熟悉的斐波那契数列,这样,这一题的突破口很明显了,m、n都是在K(包括K)之内的最大的两个满足斐波那契数列的数;

Code:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iomanip>
#include<string>
#include<algorithm>
#include<cstdlib>
#include<queue>
#include<stack>
using namespace std;
inline int read() 
{
    int X=0,w=1; 
    char c=getchar();
    while(c<'0'||c>'9')
    { 
        if (c=='-')
        {
            w=-1; 
        } 
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        X=(X<<3)+(X<<1)+c-'0';
        c=getchar();
    } 
    return X*w;
}
int n=1,m=1;
int main()
{
    freopen("mn.in","r",stdin);
    freopen("mn.out","w",stdout);
    int k;
    k=read();
    while(n+m<=k)
    {
        int pos=m;
        m=n+m;
        n=pos;
    }
    printf("%d %d",n,m);
    return 0;
}

 

posted @ 2019-07-09 16:47  卍GC卐  阅读(124)  评论(1编辑  收藏  举报