zoukankan      html  css  js  c++  java
  • 斐波那契数列 !有疑惑

    题目背景

    大家都知道,斐波那契数列是满足如下性质的一个数列:

    • f(1) = 1

    • f(2) = 1

    • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数)

    题目描述

    请你求出 f(n) mod 1000000007 的值。

    输入输出格式

    输入格式:

    ·第 1 行:一个整数 n

    输出格式:

    第 1 行: f(n) mod 1000000007 的值

    输入输出样例

    输入样例#1:
    5
    输出样例#1:
    5
    输入样例#2:
    10
    输出样例#2:
    55

     

    下面这个是对的

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<math.h>
    using namespace std;
    struct JZH{
        long long  v[2][2];
    }p,ans,x;
    JZH b={1,1,
        1,0,};
    long long  n;
    #define M  1000000007 
    JZH cheng(JZH x,JZH y)
    {    
        for(int i=0;i<=1;i++)
        for(int j=0;j<=1;j++)
        {
            p.v[i][j]=0;
            for(int k=0;k<=1;k++)
            p.v[i][j]=(p.v[i][j]+x.v[i][k]*y.v[k][j])%M;
        }
        return p;
    } 
    int main()
    {
        scanf("%lld",&n);    
        ans.v[0][0]=1;ans.v[0][1]=1;
        ans.v[1][0]=1;ans.v[1][1]=0;
        x=b;
        while(n>0)
        {
            if(n%2)    ans=cheng(ans,x);
            x=cheng(x,x);
            n=n/2;
        }  
        cout<<(ans.v[1][1])%M;
    }

    但这个不知为啥不对

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<math.h>
    using namespace std;
    struct JZH{
        long long  v[2][2];
    }f,p;
    JZH    b={1,1,
           1,0,};
    long long  n;
    #define M  1000000007 
    JZH cheng(JZH x,JZH y)
    {
        
        for(int i=0;i<=1;i++)
        for(int j=0;j<=1;j++)
        {
            p.v[i][j]=0;
            for(int k=0;k<=1;k++)
            p.v[i][j]=(p.v[i][j]+x.v[i][k]*y.v[k][j])%M;
        }
        return p;
    } 
    JZH find(int c)
    {
        if(c==1)    return    b;
        else{
            JZH    p=find(c/2);
            p=cheng(p,p);
            if(c%2)    return    cheng(b,p);
            else return p;
        }
    } 
    int main()
    {
        scanf("%lld",&n);    
        f.v[0][0]=1;f.v[0][1]=1;
        f.v[1][0]=0;f.v[1][1]=0;
        JZH    ans=cheng(f,find(n-2));
        cout<<ans.v[0][0]%M;
    }
  • 相关阅读:
    jquery
    模板库
    Luogu P1902 刺杀大使
    8.20模拟赛再次观光记
    Luogu P1122 最大子树和
    Luogu P1470 最长前缀 Longest Prefix
    8.18爆炸记
    Luogu P1388 算式
    Luogu P1103 书本整理
    8.17
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/6651267.html
Copyright © 2011-2022 走看看