zoukankan      html  css  js  c++  java
  • 斐波那契

    题目链接

    题意:给定整数n,求Fib[n]mod10000。0n210^9

    思路:[fn,fn+1]=[fn-1,fn]*[{0,1},{1,1}];递推一下就得到 [fn,fn+1]=[0,1]*([{0,1},{1,1}]^n)。

    故用矩阵快速幂去求。

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<cmath>
    #include<map>
    #include<vector>
    #define ll long long
    using namespace std;
    const int mod=10000;
    ll n;
    void mul(int f[2],int a[2][2])
    {
        int c[2];
        memset(c,0,sizeof(c));
        for(int i=0;i<2;i++)
        {
            for(int j=0;j<2;j++)
            {
                c[i]=(c[i]+(ll)f[j]*a[j][i])%mod;
            }
         }
         memcpy(f,c,sizeof(c)); 
    }
    void mulself(int a[2][2])
    {
        int c[2][2];
        memset(c,0,sizeof(c));
        for(int i=0;i<2;i++)
        {
            for(int j=0;j<2;j++)
            {
                for(int k=0;k<2;k++)
                c[i][j]=(c[i][j]+(ll)a[i][k]*a[k][j])%mod;
            }
         }
         memcpy(a,c,sizeof(c));
    }
    int main()
    {
        while(~scanf("%lld",&n))
        {
            if(n==-1)
            break;
            int f[2]={0,1};
            int a[2][2]={{0,1},{1,1}};
            while(n)
            {
                if(n&1)
                {
                    mul(f,a);
                }
                mulself(a);
                n>>=1;
            }
            printf("%d
    ",f[0]);
        }
     } 
  • 相关阅读:
    IPUtil
    MD5Util
    MyBatis环境配置及入门
    淘宝主页(静态页面)第3天
    淘宝主页(静态页面)第二天
    淘宝主页(静态页面)第1天
    力扣20 有效的括号
    力扣1 two sum
    JAVA可变参数
    JAVA环形队列
  • 原文地址:https://www.cnblogs.com/2462478392Lee/p/11309123.html
Copyright © 2011-2022 走看看