矩阵快速幂
来源:互联网 发布:管家婆数据库安装 编辑:程序博客网 时间:2024/05/24 05:37
题目描述
存在如下递推式:
题目链接:一道简单的递推题
很容易就发现这是一个矩阵快速幂,只要能构造出 N*N 的初始矩阵就可以。
代码如下:
F(n+1)=A1*F(n)+A2*F(n-1)+...+An*F(1)
求第K项的值对1000000007取模的结果
输入
单组测试数据
第一行输入两个整数 n , k (1<=n<=100,n<k<=10000000000)
第二行输入 n 个整数 F(1) F(2) ... F(n)
第三行输入 n 个整数A1 A2 ... An
输出
输出一个整数
样例输入
2 31 23 4
样例输出
10
题目链接:一道简单的递推题
很容易就发现这是一个矩阵快速幂,只要能构造出 N*N 的初始矩阵就可以。
代码如下:
#include<iostream>#include<cstring>#include <cstdio>#define LL long longusing namespace std;const int N=105;const LL m=1000000007;int n;LL k;struct Matrix{ LL mp[N][N];};Matrix matrix,A; // A矩阵存储结果F[1..n] ,matrix存放系数a[1...n]LL f[N];void Initiate(){ for(int i=0; i<n; i++) scanf("%lld",&matrix.mp[0][i]); for(int i=1; i<n; i++) { for(int j=0; j<n; j++) { if(i==(j+1)) matrix.mp[i][j]=1; else matrix.mp[i][j]=0; } }}Matrix Mul(Matrix a,Matrix b){ Matrix c; memset(c.mp,0,sizeof(c.mp)); for(int k=0; k<n; ++k) { for(int i=0; i<n; ++i) { if(a.mp[i][k]==0) continue; //这里进行优化,可以节省时间(卡时间的题) for(int j=0; j<n; ++j) c.mp[i][j]=(c.mp[i][j]+(a.mp[i][k]*b.mp[k][j])%m)%m; } } return c;}LL Pow(LL k){ while(k>0) //这里一定要加上 >0 的条件,否则很容易死循环 { if(k&1) A=Mul(matrix,A); k >>= 1; matrix=Mul(matrix,matrix); } return A.mp[0][0];}int main(){// freopen("in.txt","r",stdin); while(scanf("%d%lld",&n,&k)!=EOF) { for(int i=0; i<n; ++i) for(int j=0; j<n; ++j) { if(i==j) A.mp[i][j]=1; else A.mp[i][j]=0; } for(int i=0; i<n; ++i) // 把初始的数字 A[1] - A[n] 放入储存结果的矩阵 scanf("%lld",&A.mp[n-i-1][0]); Initiate(); cout<<Pow(k-n)<<endl; } return 0;}
阅读全文
0 0
- 快速矩阵快速幂
- 转移矩阵+矩阵快速幂
- 矩阵乘法 矩阵快速幂
- 构造矩阵+矩阵快速幂
- 矩阵快速幂,矩阵加法,矩阵乘法
- 快速幂||矩阵快速幂
- 快速幂&矩阵快速幂
- 快速幂,矩阵快速幂
- 快速幂 矩阵快速幂
- 快速幂&矩阵快速幂
- 【快速幂】【矩阵快速幂】
- 快速幂和快速矩阵
- poj3070--矩阵 快速幂
- POJ3233矩阵快速幂
- poj3070Fibonacci 矩阵快速幂
- 矩阵的快速幂
- 矩阵快速幂
- 矩阵的快速幂
- 输入流与输出流
- Chipscope信号无法找到的解决方案
- 构建我的第一个Ionic项目
- quick-cocos2d-x CCHttpRequest詳細說明及用法
- 第2章 Liunx 安装maven
- 矩阵快速幂
- git学习笔记
- Android 深入分析Activity生命周期
- jdbc.properties
- Java与算法(4)
- 获取服务器数据通过Gson解析显示Listview上
- 利用SpringData环境搭建项目
- Java时间格式转换大
- bzoj 2244 [SDOI2011]拦截导弹