矩阵快速幂模版
来源:互联网 发布:erp软件开发教程 编辑:程序博客网 时间:2024/06/05 05:17
输入样例是
1 1 12 也就是第12个斐波那契数列,
原理是
f(n) = |1 1| * |f(n-2)|
f(n-1)= |1,0| * |f(n-1)|
#include <iostream>#include <string.h>#include <stdio.h>using namespace std;struct ttt{ int map1[200][200];};int n;ttt fun1(ttt &a,ttt &b){ ttt c; int i,j,k; for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ c.map1[i][j]=0; for(k=1;k<=n;k++) c.map1[i][j]+=a.map1[i][k]*b.map1[k][j]; } } return c;}ttt fun2(ttt &a){ ttt b; int i,j,k; for(i=1;i<=n;i++) for(j=1;j<=n;j++){ b.map1[i][j]=0; for(k=1;k<=n;k++) b.map1[i][j]+=a.map1[i][k]*a.map1[k][j]; } return b;}ttt pow1(ttt &a,int k){ ttt b; int i,j; memset(b.map1,0,sizeof(b.map1)); for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i==j) b.map1[i][j]=1; while(k){ //cout << "k=" <<k <<endl; if(k&1) b=fun1(b,a); k=k>>1; a=fun2(a); } return b;}int main(){ freopen("in.txt","r",stdin); int i,j,k,l,f1,f2,f3,t1,t2,t3; int r,c; cin >>f1 >> f2>> k; ttt a; memset(a.map1,0,sizeof(a.map1)); n=2; a.map1[1][1]=1; a.map1[1][2]=1; a.map1[2][1]=1; a.map1[2][2]=0; a=pow1(a,k-2); /*for(i=1;i<=2;i++){ for(j=1;j<=2;j++) cout << a.map1[i][j] << " "; cout <<endl; }*/ cout << a.map1[1][1]*f2+a.map1[1][2]*f1 <<endl; return 0;}
f(n)=b1*f(n-1)+a1*f(n-2)+c 输入 f1 f2 a1 b1 c1 n
例子
6 7 3 2 4 3
输出
37
代码:
#include <iostream>#include <string.h>#include <stdio.h>using namespace std;struct ttt{ int map1[200][200];};int n;ttt fun1(ttt &a,ttt &b){ ttt c; int i,j,k; for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ c.map1[i][j]=0; for(k=1;k<=n;k++) c.map1[i][j]+=a.map1[i][k]*b.map1[k][j]; } } return c;}ttt fun2(ttt &a){ ttt b; int i,j,k; for(i=1;i<=n;i++) for(j=1;j<=n;j++){ b.map1[i][j]=0; for(k=1;k<=n;k++) b.map1[i][j]+=a.map1[i][k]*a.map1[k][j]; } return b;}ttt pow1(ttt &a,int k){ ttt b; int i,j; memset(b.map1,0,sizeof(b.map1)); for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i==j) b.map1[i][j]=1; while(k){ //cout << "k=" <<k <<endl; if(k&1) b=fun1(b,a); k=k>>1; a=fun2(a); } return b;}int main(){ freopen("in.txt","r",stdin); int i,j,k,l,f1,f2,f3,t1,t2,t3; int r,c; int a1,b1,c1; cin >>f2 >> f1>>b1>>a1>>c1>> k; ttt a; memset(a.map1,0,sizeof(a.map1)); n=3; a.map1[1][1]=a1; a.map1[1][2]=b1; a.map1[1][3]=1; a.map1[2][1]=1; a.map1[2][2]=0; a.map1[2][3]=0; a.map1[3][1]=0; a.map1[3][2]=0; a.map1[3][3]=1; a=pow1(a,k-2); /*for(i=1;i<=3;i++){ for(j=1;j<=3;j++) cout << a.map1[i][j] << " "; cout <<endl; }*/ cout << (a.map1[1][1]*f2)+(a.map1[1][2]*f1)+a.map1[1][3]*c1 <<endl; return 0;}
0 0
- 矩阵快速幂模版
- 模版--矩阵快速幂
- 矩阵快速幂模版
- 矩阵快速幂模版
- 矩阵快速幂 模版
- 矩阵快速幂模版
- 模版—矩阵连乘快速幂
- NYOJ 148 矩阵快速幂模版
- HDU 1757 矩阵快速幂模版
- 51nod 矩阵快速幂模版题
- poj 3734 <矩阵快速幂模版>
- 快速幂 模版
- POJ1995 快速幂模版
- 快速幂模版
- 快速幂模版
- 快速幂 模版
- 快速幂模版
- 快速幂模版
- Java中static的作用详解
- 用编程的方式开发UI界面
- iOS中的权限开启问题
- toast(吐司)的工具类
- svn is already locked 无法Team 更新
- 矩阵快速幂模版
- JVM中一些参数
- 300. Longest Increasing Subsequence
- Knockout应用开发指南 第二章:监控属性(Observables)
- Android 笔记:Android ScrollView 自动滑动到底部
- 今天开始维护个人技术博客
- maven引入jar包依赖报错
- Could not find method runProguard() for arguments [false] on B...
- 如何在网站集成Payssion的国外支付方式?