一个简单的矩阵乘法(快速幂)

  //求FIB的第n项
1
#include <iostream> 2 #include <vector> 3 #include <cstdio> 4 5 using namespace std; 6 #define LL long long 7 8 typedef vector<int> vec; 9 typedef vector<vec> mat; 10 11 mat mul(mat& A, mat& B) 12 { 13 mat C ( A.size(),vec(B[0].size())); 14 15 for(int i=0;i<A.size();i++) 16 { 17 for(int k = 0;k<B.size();k++) 18 { 19 for(int j = 0;j<B[0].size();j++) 20 { 21 C[i][j] = C[i][j] + A[i][k]*B[k][j] ; 22 } 23 } 24 } 25 return C; 26 } 27 28 mat pow(mat A, LL n) 29 { 30 mat B( A.size(),vec(A.size())); 31 32 for(int i=0;i<A.size();i++) 33 { 34 B[i][i] =1; 35 } 36 while( n>0) 37 { 38 if( n&1) B = mul(B,A); 39 A = mul(A,A); 40 n>>=1; 41 } 42 return B; 43 44 45 } 46 47 int main() 48 { 49 LL n ; 50 cin>>n; 51 mat A ( 2, vec(2)); 52 A[0][0] =1; A[0][1] = 1; 53 A[1][0] = 1; A[1][1] = 0; 54 A = pow( A, n); 55 printf("%d\n",A[1][0]); 56 return 0; 57 }

 

转载于:https://www.cnblogs.com/doubleshik/p/3537666.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值