• P1962 斐波那契数列


    Fn表示数列的第n项

    那么我们如果把Fn,Fn-1写成蒟阵的形式,可以按照如下推导过程对这个蒟阵进行拆分,从而写成便于计算的形式

    如图,这个是可以写成蒟阵相乘的形式的,而这个蒟阵可以用蒟阵快速幂来计算,具体可以见我的博客

    下面是代码:

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<cstdlib>
    using namespace std;
    typedef long long ll;
    typedef long double ld;
    typedef pair<int,int> pr;
    const double pi=acos(-1);
    #define rep(i,a,n) for(ll i=a;i<=n;i++) 
    #define per(i,n,a) for(ll i=n;i>=a;i--)
    #define Rep(i,u) for(int i=head[u];i;i=Next[i])
    #define clr(a) memset(a,0,sizeof a)
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define sc second
    ld eps=1e-9;
    ll pp=1000000007;
    ll mo(ll a,ll pp){if(a>=0 && a<pp)return a;a%=pp;if(a<0)a+=pp;return a;}
    ll powmod(ll a,ll b,ll pp){ll ans=1;for(;b;b>>=1,a=mo(a*a,pp))if(b&1)ans=mo(ans*a,pp);return ans;}
    ll read(){
        ll ans=0;
        char last=' ',ch=getchar();
        while(ch<'0' || ch>'9')last=ch,ch=getchar();
        while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar();
        if(last=='-')ans=-ans;
        return ans;
    }
    //head   从这里开始哦 
    struct matrix{
        ll a[2][2];
    };//注意这里要用ll保证不会爆 
    matrix operator *(matrix a, matrix b){//定义*运算 
        matrix c;
        rep(i,0,1)//简写的方式,详见另一篇博客 
            rep(j,0,1){
                c.a[i][j]=0;
                rep(k,0,1)
                    c.a[i][j] = (c.a[i][j]+a.a[i][k]*b.a[k][j])%pp;
            }
        return c;
    }
    ll k;
    int main(){
        cin>>k;
        matrix a; 
        a.a[0][0]=0;a.a[0][1]=1;
        a.a[1][0]=1;a.a[1][1]=1; 
        matrix ans;
        ans.a[0][0]=1;ans.a[0][1]=0;
        ans.a[1][0]=0;ans.a[1][1]=1;//把ans初始化为单位蒟阵 
        ll b=k-1;
        while(b){
            if(b&1)ans=ans*a;
            a=a*a;
            b/=2;
        }//一个快速幂 
        ll fk = (ans.a[0][0]+ ans.a[0][1])%pp;
        cout<<fk<<endl;//这不是f**k 
        //O(log B *2^3)
    }
  • 相关阅读:
    使用MaxCompute Java SDK 执行任务卡住了,怎么办?
    通过编辑文件的方式对DNS服务器进行配置
    2009级计算机应用 嵌入式方向课表
    微软首宗针对中国大企业盗版案宣判:获赔217万
    小數點的運算[討論區- PHP新手區] : 台灣PHP聯盟
    Linux C编程一站式学习
    用wget做站点镜像
    2008级嵌入式方向学生 学习成果(创意)
    Linux领航未来操作系统
    fedora12 微软雅黑
  • 原文地址:https://www.cnblogs.com/lcezych/p/10656892.html
Copyright © 2020-2023  润新知