数学问题之(矩阵快速幂)

简介: 数学问题之(矩阵快速幂)

P3390 【模板】矩阵快速幂

题目背景

矩阵快速幂

题目描述

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

输入格式

第一行两个整数 n,k

接下来 n 行,每行 n 个整数,第 i 行的第 j 的数表示 Ai,j。

输出格式

输出 A^k

共 n 行,每行 n 个数,第 i 行第 j 个数表示 (A^k)i,j,每个元素对 10^9+7 取模。

样例 #1

样例输入 #1

2 1

1 1

1 1

样例输出 #1

1 1

1 1

样例输入 #2

2 3

1 2

2 1

样例输出 #2

13 14

14 13

提示

【数据范围】  

对于 100\% 的数据:1<= n <= 100,0<= k <=10^12, |Ai,j| <= 1000

1. //示例代码  C++语言
2. #include <bits/stdc++.h>
3. using namespace std;
4. typedef long long LL;
5. const int M=1e9+7;
6. struct matrix{//矩阵结构体
7.  LL c[102][102];
8.  matrix(){memset(c,0,sizeof(c));}//初始化矩阵
9. }A,res;
10. LL n,k;
11. matrix operator*(matrix &a,matrix &b){//原算符重载 *
12.   matrix t;
13.   for(int i=1;i<=n;i++)
14.     for(int j=1;j<=n;j++)
15.       for(int k=1;k<=n;k++)//矩阵乘法
16.         t.c[i][j]=(t.c[i][j]+a.c[i][k]*b.c[k][j])%M;
17.   return t;
18. }
19. void quickpow(LL k){//快速幂
20.   for(int i=1;i<=n;i++) res.c[i][i]=1;//初始化单位矩阵
21.   while(k){
22.     if(k&1) res=res*A;
23.     A=A*A;
24.     k>>=1;
25.   }
26. }
27. int main()
28. {
29.   scanf("%lld %lld",&n,&k);
30.   for(int i=1;i<=n;i++)
31.     for(int j=1;j<=n;j++) cin>>A.c[i][j];//读入
32.   quickpow(k);//运算
33.   for(int i=1;i<=n;i++){
34.     for(int j=1;j<=n;j++)
35.       cout<<res.c[i][j]<<" ";//输出结果
36.     cout<<endl;
37.   } 
38.   return 0;
39. }
1. # 示例代码 Python版
2. # 样例都没问题 提交只过两个点 没找到原因 有知道原因的大神请留言指导一下
3. import numpy as np
4. M = 10 ** 9 + 7
5. 
6. n, k = map(int, input().split())
7. a = np.zeros([n, n], dtype=int)
8. res = np.zeros([n, n], dtype=int)
9. 
10. for i in range(n):
11.     res[i][i] = 1
12.     line = input()
13.     j = 0
14. for p in line.split():
15.         a[i][j] = int(p)
16.         j += 1
17. 
18. while k > 0:
19. if k & 1:
20.         res = np.matmul(res, a)
21.         res = res % M
22.     a = np.matmul(a, a)
23.     a = a % M
24.     k >>= 1
25. 
26. for i in range(n):
27. for j in range(n):
28. print(res[i][j], end=' ')
29. print('')
相关文章
数学问题之(矩阵加速递推快速幂)
数学问题之(矩阵加速递推快速幂)
数学知识-约数
数学知识-约数
|
机器学习/深度学习 人工智能
数学知识-质数
数学知识-质数
|
算法 C++
数学知识:约数(一)
复习acwing算法基础课的内容,本篇为讲解数学知识:约数,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
133 0
数学知识:约数(一)
数学知识:约数(二)
AcWing 871. 约数之和
92 0
数学知识:约数(二)
|
算法
数学知识:快速幂
复习acwing算法基础课的内容,本篇为讲解数学知识:快速幂,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
91 0
数学知识:快速幂