题解

57 条题解

  • 3
    @ 2016-12-16 15:42:34

    Fibonacci数列的相邻两项可以满足条件
    要用longlong啊!!!

    #include <cstdio>
    int main() {
        int k,m = 1,n = 1;
            scanf("%d",&k);
            while (n+m <= k) {
                n += m;
                m = n-m;
          }
          printf("%I64d",(long long)m*(long long)m+(long long)n*(long long)n);
          return 0;
    }
    
  • 3
    @ 2015-02-09 22:34:50

    好高级,斐波那契,怎么哪里都有你?
    这种题要推导出来容易,那就是:知道答案了,往答案上硬拽。
    神将灵感赋予少数人,将找规律、不完全归纳的能力付给了所有人。
    一定要多写几个例子,再说自己不会。
    打表法找规律,先编一个超时算法去寻找规律。
    #include<iostream>
    #include<string.h>
    #include<stdio.h>
    using namespace std;

    int main(){
    long long int k;
    cin >> k;
    long long int i, j,p;
    long long int ans = 0;
    long long int x, y;
    for (k = 1; k < 100;k++){
    for (i = 1; i <= k; i++){
    for (j = 1; j <= k; j++){
    if (i*i - i*j - j*j == 1 || i*i - j*i - j*j == -1){
    if (ans < i*i + j*j){
    ans = i*i + j*j;
    x = i;
    y = j;
    }
    }
    }
    }
    cout <<k<<" : "<< x<< " " <<y << " " << ans << endl;
    }
    return 0;
    }
    找到规律之后,一看是斐波那契。
    #include<iostream>
    #include<string.h>
    #include<stdio.h>
    using namespace std;

    int main(){
    freopen("in.txt", "r", stdin);
    long long int k;
    cin >> k;
    long long int i, j;
    i = j = 1;
    while (1){
    j += i;
    i = j - i;
    if (j > k)break;
    }
    i = j - i;
    j = j - i;
    cout << i*i + j*j << endl;
    return 0;
    }

    • @ 2015-08-04 15:38:23

      顶顶顶

    • @ 2017-10-31 19:42:02

      说得对,顶一个

  • 1
    @ 2017-07-18 16:37:09

    看到第一个我就害怕了。

    #include<iostream>
    #define LL long long
    using namespace std;
    LL k,fi[66];
    void fibi () {fi[0]=1,fi[1]=1,fi[2]=2;for(int i=3;i<=66;i++) fi[i]=fi[i-1]+fi[i-2];return;}
    int main () { 
        
        ios::sync_with_stdio(false);
        fibi();
        cin>>k;
        if (k==1) {cout<<2;return 0;}
        for(int i=2;i<=66;i++) if (fi[i+1]>k) {cout<<(LL)(fi[i-1]*fi[i-1])+(LL)(fi[i]*fi[i]);return 0;}
        
    }
    

  • 1
    @ 2009-10-30 19:34:07

    可以求出n=(m+sqrt(5*m^2+4))/2,所以必须满足5*m^2+4为平方数,求导知只需当m取得max即可取得m^2+n^2的max,所以只需求出m的上限。用数学归纳法可得n m 为fib的相邻项。

    下面给出严格证明:

    (n^2-mn-m^2)^2=(m(m+n)-n^2)^2=((m-n+n)(m+n)-n^2)^2=((m+n)^2-n(m+n)-n^2)^2,为fib。。

  • 0
    @ 2016-11-14 00:22:49

    #include <iostream>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    using namespace std;

    int main() {
    long long k;
    cin >> k;
    if (k == 1) {
    cout << "2";
    return 0;
    }

    long long x=1, y=0;
    for (int i=2;i <= k+1;i++) {
    long long t=x;
    if (x+y > k) {
    cout << x*x+y*y;
    return 0;
    }

    x+=y;
    y=t;
    }

    cout << x*x+y*y;

    return 0;
    }

    warning:记得开long long

  • 0
    @ 2016-08-11 17:05:54

    为何到处都是裴波那契
    Pascal
    var
    n,t,k,m:qword;
    begin
    readln(k);
    m:=1;n:=1;
    while t<=k do
    begin
    t:=m+n;
    if t<k then
    begin
    m:=n;
    n:=t;
    end;
    end;
    writeln(sqr(m)+sqr(n));
    end

  • 0
    @ 2015-11-14 22:56:56

    好短!
    #include<cstdio>
    unsigned long long a[3]={0,1,1},k,i;
    int main() {
    scanf("%d",&k);
    for (i=3;a[(i-1)%3]<=k;i++)
    a[i%3]=a[(i-1)%3]+a[(i-2)%3];
    printf("%llu",a[i%3]*a[i%3]+a[(i+1)%3]*a[(i+1)%3]);
    }

    • @ 2016-11-06 16:55:01

      这样才短

      #include<iostream>
      long long x[60]={0,1},k,i=2;
      main(){std::cin>>k;for(;x[i-1]<=k;++i)x[i]=x[i-1]+x[i-2];std::cout<<x[i-3]*x[i-3]+x[i-2]*x[i-2];}

  • 0
    @ 2015-08-29 21:26:43

    斐波那契!!!

  • 0
    @ 2015-08-01 12:13:52

    #include<iostream>
    #include<algorithm>
    using namespace std;

    int main()
    {
    int k;
    cin>>k;
    long long int a=1, b=1;
    while(b <= k){
    b += a;
    a = b-a;

    }
    a = b-a;
    b -= a;
    long long int ans = a*a + b*b;

    cout<<ans;
    system("pause");
    return 0;
    }
    先找规律。。。

  • 0
    @ 2015-04-15 13:36:40

    var
    k,n,m,t:qword;
    begin
    readln(k);
    m:=1; n:=1;
    while k>n do
    begin
    dec(k,n);
    t:=m;
    m:=m+n;
    n:=t;
    end;
    writeln(m*m+n*n);
    end.

  • 0
    @ 2014-10-28 20:38:16

    Because (n^ 2-mn-m^2)^2 = 1,
    It's easy to know that n^ 2-mn-m^2 = 1 or -1
    Soppose that n^ 2-mn-m^2 = 1
    We made m→n,n→m+n,then
    (m+n)^2-n(m+n)-n^2
    =m^2+2mn+n^2-mn-n^2-n^2
    =m^2+mn-n^2
    =-(n^2-mn-m^2)
    =-1
    As we can see,the next rear pair after (m,n) is (n,m+n).
    So,m,n is two nearby number in the Fibonacci numlist.
    So m,n is the biggest two numbers in the Fibonacci numlist when they're not bigger than K.
    The only thing we need to do is printing the Fibonacci numlist before the program!

  • 0
    @ 2014-08-17 12:36:37

    int 64才是王道
    数学题啊 好像是假期的一道模拟题
    壮哉!

    #include<iostream>
    #include<fstream>
    #include<cmath>
    #include<cstring>
    #include<cstdio>
    #include<cstdlib>
    using namespace std;
    unsigned long long m,n,k,t;
    int main()
    {
    //freopen("maxf.in","r",stdin);
    //freopen("maxf.out","w",stdout);
    scanf("%I64d",&k);
    n = 1;
    while (m + n <= k)
    {
    t = n;
    n += m;
    m = t;
    //printf("%I64d\n",m * m + n * n);
    }
    printf("%I64d\n",m * m + n * n);
    return 0;
    }
    复制了自己假期写的代码~

  • 0
    @ 2014-01-05 00:09:51

    发现数学是 奇妙 的但是我**数学不好。**

  • 0
    @ 2013-10-18 17:16:32

    var m,n,k,a:qword;
    begin
    m:=1; n:=1;
    read(k);
    if k=1 then begin writeln(2); halt; end;
    repeat
    a:=n;
    n:=m+a;
    m:=a;
    until n+m>k;
    writeln(sqr(n)+sqr(m));
    end.

  • 0
    @ 2013-08-11 10:19:56

    打表做出来的 不容易啊亲 也是被int64坑了 不全是int64过不了啊。。
    var

    a:array[1..45] of int64;
    i,j,k,m,n:int64;
    procedure init;
    begin
    a[1]:=1;
    a[2]:=1;
    a[3]:= 2;
    a[4]:= 3;
    a[5]:= 5;
    a[6]:= 8;
    a[7]:= 13;
    a[8]:= 21;
    a[9]:= 34;
    a[10]:= 55;
    a[11]:= 89;
    a[12]:=144;
    a[13]:= 233;
    a[14]:= 377;
    a[15]:= 610;
    a[16]:= 987;
    a[17]:= 1597;
    a[18]:= 2584;
    a[19]:= 4181;
    a[20]:= 6765;
    a[21]:= 10946;
    a[22]:= 17711;
    a[23]:= 28657;
    a[24]:= 46368;
    a[25]:= 75025;
    a[26]:=121393;
    a[27]:= 196418;
    a[28]:= 317811;
    a[29]:= 514229;
    a[30]:= 832040;
    a[31]:= 1346269;
    a[32]:= 2178309;
    a[33]:= 3524578;
    a[34]:= 5702887;
    a[35]:= 9227465;
    a[36]:= 14930352;
    a[37]:= 24157817;
    a[38]:= 39088169;
    a[39]:= 63245986;
    a[40]:= 102334155;
    a[41]:= 165580141;
    a[42]:= 267914296;
    a[43]:= 433494437;
    a[44]:= 701408733;
    a[45]:= 1134903170;
    end;
    begin
    init;
    i:=45;
    readln(k);
    while (k<a[i]) do dec(i);
    writeln(sqr(a[i])+sqr(a[i-1]));
    end.

  • 0
    @ 2012-11-22 21:09:39

    ├ 测试数据 01:答案正确... (14ms, 676KB)

    ├ 测试数据 02:答案正确... (14ms, 676KB)

    ├ 测试数据 03:答案正确... (0ms, 676KB)

    ├ 测试数据 04:答案正确... (0ms, 676KB)

    ├ 测试数据 05:答案正确... (13ms, 676KB)

    ├ 测试数据 06:答案正确... (14ms, 676KB)

    ├ 测试数据 07:答案正确... (15ms, 676KB)

    ├ 测试数据 08:答案正确... (15ms, 676KB)

    ├ 测试数据 09:答案正确... (0ms, 676KB)

    ├ 测试数据 10:答案正确... (15ms, 676KB)

    ---|---|---|---|---|---|---|---|-

    Accepted / 100 / 104ms / 676KB

    fib数列

  • 0
    @ 2009-11-02 17:48:56

    注意:此题要用qword

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    var n,t,k,m:qword;

    begin

    readln(k);

    m:=1;n:=1;

    repeat

    t:=m+n;

    if tk;

    writeln(sqr(m)+sqr(n));

    end.

  • 0
    @ 2009-10-31 17:26:27

    原来int64就可以过啊……

    我用高精AC的

    ......

  • 0
    @ 2009-10-31 16:10:35

    原来是fib数列

    var k,m,n,a:int64;

    begin

    readln(k);

    m:=1; n:=1;

    while n

  • 0
    @ 2009-10-28 14:00:51

    飞厦OI?

    作为聿怀OI我感到不斩此水题对不起飞厦的同学们

信息

ID
1543
难度
3
分类
数论 | Fibonacci数列 点击显示
标签
(无)
递交数
1449
已通过
704
通过率
49%
被复制
3
上传者