矩阵相关
【模板】矩阵快速幂
题目背景
矩阵快速幂
题目描述
给定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
输入输出样例
输入 #12 1 1 1 1 1输出 #11 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; }
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
We're the lovers above the city.