zoukankan      html  css  js  c++  java
  • na 斐波那契数列f(f(n))

    题目描述:
    给出T个n,求斐波那契数列的f(f(n)).(答案取模1e9+7)
    数据范围:
    100% 1<=n<=10100

    数据好大,那么这题一定有规律。
    首先先要了解一个关于斐波切数列的性质,即斐波那契数列 ( 取模 ) 的周期性。
    解释一下:就是斐波那契数列对于Mod取模后构成的数列,具有周期性。

    对于这道题,我们就可以利用斐波那契数列的这个性质。
    f(f(n)),最后要对MOD=1e9+7取模,我们先求一下菲波那切数列对于1e9+7的周期T1。
    那么ans=f(f(n))%MOD=f(f(n)%T1)%MOD

    n<=10100,我们还需要把n的问题解决;
    再利用斐波那契数列的周期性,求出f(n)%T1的周期T2
    那么ans=f(f(n%T2)%T1)%MOD

    问题就解决啦!

    求周期的代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    #define ull unsigned long long
    using namespace std;
    long long a,b,c,T=0,MOD;
    int main()
    {
        cin>>MOD;
        a=1,b=2;T=3;
        while((a!=1)||(b!=1))
        {
            c=(a+b)%MOD;
            a=b;
            b=c;
            T++;
        }
        T-=2; 
        printf("%lld
    ",T);//T就是f关于MOD的周期
        return 0;
    }

    AC代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define MO1 1000000007
    #define MO2 2000000016
    #define MO3 329616
    #define LL long long
    using namespace std;
    char nn[1000];
    int T;
    LL n;
    LL A[3][3]={0,0,0,
                0,0,1,
                0,1,1,};
    LL f[3][3],bak[3][3];
    LL Fast_Pow(LL k,LL MOD)
    {
        f[1][1]=1,f[1][2]=1;
        f[2][1]=0,f[2][2]=0;
    
        A[1][1]=0;A[1][2]=A[2][1]=A[2][2]=1;
        if(k<=2) return 1;
        k-=2;
        while(k)
        {
            if(k%2) 
            {
                for(int i=1;i<=2;i++)
                for(int j=1;j<=2;j++)
                bak[i][j]=f[i][j],f[i][j]=0;
                for(int i=1;i<=2;i++)
                for(int j=1;j<=2;j++)
                for(int l=1;l<=2;l++)
                (f[i][j]+=bak[i][l]*A[l][j]%MOD)%=MOD;
            }
            for(int i=1;i<=2;i++)
            for(int j=1;j<=2;j++)
            bak[i][j]=A[i][j],A[i][j]=0;
            for(int i=1;i<=2;i++)
            for(int j=1;j<=2;j++)
            for(int l=1;l<=2;l++)
            (A[i][j]+=bak[i][l]*bak[l][j]%MOD)%=MOD;
    
            k/=2;
        }
        return f[1][2];
    }
    int main()
    {
        freopen("na.in","r",stdin);
        freopen("na.out","w",stdout);
        scanf("%d",&T);
        while(T--)
        {
            scanf("%s",nn);n=0;
            for(int i=0;i<strlen(nn);i++) n=(n*10+(nn[i]-'0'))%MO3;
    
            LL ans1=Fast_Pow(n,MO2);//求fn%MO2 
            LL ans2=Fast_Pow(ans1,MO1);//求fans1%MO1 
            printf("%lld
    ",ans2);
        }
        return 0;
    }
  • 相关阅读:
    代理模式
    spring aop
    mybatis从入门到精通(其他章节)
    mybatis从入门到精通(第6章)
    Java中Compareable和Comparator两种比较器的区别
    Java的equals方法的使用技巧
    Dubbo的配置过程,实现原理及架构详解
    什么是IPFS?IPFS与区块链有什么关系
    leetCode242 有效的字母异位词
    需要多个参数输入时-----------------考虑使用变种的Builder模式
  • 原文地址:https://www.cnblogs.com/dfsac/p/7587784.html
Copyright © 2011-2022 走看看