矩阵快速幂与斐波那契

题目链接

视频讲解

好像没有可以完全通过的代码。。。

斐波那契和矩阵的关系:

矩阵快速幂与斐波那契_第1张图片

#include 

using namespace std;

typedef long long ll;

vector<vector<ll> > mat_mul(vector<vector<ll> > a,vector<vector<ll> > b)
{
     
    int ra = a.size(), ca = a[0].size(), rb = b.size(), cb = b[0].size();
    vector<vector<ll> > res(ra, vector<ll>(cb, 0));
    for (int k=0; k<ca; k++)
        for (int i=0; i<ra; i++)
            for (int j=0; j<cb; j++)
            {
     
                res[i][j] += a[i][k]*b[k][j];
            }
    return res;
}
vector<vector<ll> > quick_mat_pow(vector<vector<ll> > a,ll n)
{
     
    vector<vector<ll> > res= {
     {
     1,0},{
     0,1}};
    vector<vector<ll> > p=a;
    ll t=n;
    for(; t>0; t>>=1)
    {
     
        if(t&1)
            res=mat_mul(res,p);
        p=mat_mul(p,p);
    }
    return res;
}
ll fib(ll n)
{
     
    if(n<2)
    {
     
        if(n==0)
            return 0;
        else
            return 1;
    }
    vector<vector<ll> > f= {
     {
     1},{
     0}};
    vector<vector<ll> > base= {
     {
     1,1},{
     1,0}};
    return mat_mul(quick_mat_pow(base,n-1),f)[0][0];
}
int main()
{
     
    cout<<0%19-1<<endl;
    ll n,m,mod;
    while(cin>>n>>m>>mod)
    {
     
        cout<<(fib(n+2)-1)%fib(m)%mod<<endl;
    }
    return 0;
}

斐波那契函数的性质:

斐波那契通项公式:
矩阵快速幂与斐波那契_第2张图片
求证过程
矩阵快速幂与斐波那契_第3张图片
斐波那契与数论:
矩阵快速幂与斐波那契_第4张图片
斐波那契恒等式:
矩阵快速幂与斐波那契_第5张图片
快速幂的实现:

#include 
#include 
using namespace std;
double Pow(double x, int n)
{
     
    double ans, p;
    long long t = abs((long long)n);
    p = x;
    ans = 1;
    for ( ; t>0; t>>=1)
    {
     
        if(t&1)
            ans*=p;
        p = p * p;
    }
    return n > 0 ? ans: 1/ans;
}

int main()
{
     
    double x;
    int n;
    cin>>x>>n;
    cout<<Pow(x,n)<<endl;
    return 0;
}

vector >的使用:

vector<vector<int> > A;//正确的定义方式
vector<vector<int>> A;//c++11之前这样定义是错误的,c++11之后支持这种定义方式

codeblocks设置支持c++11:Settings->Compiler->Compiler Flags
矩阵快速幂与斐波那契_第6张图片

你可能感兴趣的:(蓝桥杯)