矩阵相关


【模板】矩阵快速幂

题目背景

矩阵快速幂

题目描述

给定n*n的矩阵A,求A^k

输入格式

第一行,n,k

第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素

输出格式

输出A^k

共n行,每行n个数,第i行第j个数表示矩阵第i行第j列的元素,每个元素模10^9+7

输入输出样例

输入 #1
2 1
1 1
1 1
输出 #1
1 1
1 1

说明/提示

n<=100, k<=10^12, |矩阵元素|<=1000 算法:矩阵快速幂

#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define mod 1000000007
#define ll long long
using namespace std;
struct ma{
    ll m[101][101];
};
ma a,e;
ll n,k;

ma mul(ma x,ma y)
{
    ma c;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    c.m[i][j]=0;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    for(int k=1;k<=n;k++)
    c.m[i][j]=c.m[i][j]%mod+x.m[i][k]*y.m[k][j]%mod;
    return c; 
}
ma pow(ma x,ll y)  
{
    ma ans=e;
    while(y)
    {
        if(y&1)
        ans=mul(ans,x);  
        x=mul(x,x);
        y>>=1;
    }
    return ans;
}

int main()
{ 
    std::ios::sync_with_stdio(false);
    cin>>n>>k;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    cin>>a.m[i][j];     
    for(int i=1;i<=n;i++)
    e.m[i][i]=1;    
    ma ans=pow(a,k);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        cout<<ans.m[i][j]%mod<<" ";
        cout<<endl;
    }  
    return 0;
}
View Code

TengBieBie已经学习了很多关于斐波那切数列的性质,所以他感到一些些厌烦。现在他遇到了一个新的数列,这个数列叫做Float-Bonacci。这里有一个关于Float-Bonacci的定义。

对于一个具体的n,TengBieBie想要快速计算FB(n).

但是TengBieBie对FB的了解非常少,所以他向你求助。

你的任务是计算FB(n).FB(n)可能非常大,请输出FB(n)%1,000,000,007 (1e9+7)即可。

输入

输入共一行,在一行中给出一个整数n (1<=n<=1,000,000,000)。

输出

对于每一个n,在一行中输出FB(n)%1,000,000,007 (1e9+7)。

输入样例

5

输出样例

2
      
     *5即可

 
posted @ 2019-10-26 21:13  3200Phaethon  阅读(154)  评论(0编辑  收藏  举报