首页 > 其他 > 详细

P1962 斐波那契数列

时间:2019-04-04 21:44:36      阅读:129      评论:0      收藏:0      [点我收藏+]

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)
}

 

P1962 斐波那契数列

原文:https://www.cnblogs.com/lcezych/p/10656892.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!