AcWing 225. 矩阵幂求和(递归)

2024-04-15 23:08
文章标签 225 递归 矩阵 acwing 求和

本文主要是介绍AcWing 225. 矩阵幂求和(递归),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

思路:
用朴素的递归就可以解决。
如果 k k k是偶数,那么
f ( A , k ) = A 1 + A 2 + A 3 + . . . + A k = A 1 + A 2 + . . . + A k 2 + A k 2 ( A 1 + A 2 + A 3 . . . + A k 2 ) f(A,k)=A^1+A^2+A^3+...+A^k=A^1+A^2+...+A^{\frac{k}{2}}+A^{\frac{k}{2}}(A^1+A^2+A^3...+A^{\frac{k}{2}}) f(A,k)=A1+A2+A3+...+Ak=A1+A2+...+A2k+A2k(A1+A2+A3...+A2k)
= > => =>
f ( A , k ) = f ( A , k 2 ) + f ( A , k 2 ) ∗ A k 2 f(A,k)=f(A,\frac{k}{2})+f(A,\frac{k}{2})*A^{\frac{k}{2}} f(A,k)=f(A,2k)+f(A,2k)A2k

如果 k k k是奇数,那么
f ( A , k ) = f ( A , k 2 ) + A k 2 + 1 + f ( A , k 2 ) ∗ A k 2 + 1 f(A,k)=f(A,\frac{k}{2})+A^{\frac{k}{2}+1}+f(A,\frac{k}{2})*A^{\frac{k}{2}+1} f(A,k)=f(A,2k)+A2k+1+f(A,2k)A2k+1

这就可以直接递归求解了。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int maxn = 207;
const int mod = 2009;
int n,k,m;
int mp[1005];
struct Matrix {int Ma[maxn][maxn];void clear() {memset(Ma,0,sizeof(Ma));}void init() {clear();for(int i = 1;i <= n;i++) {Ma[i][i] = 1;}}
}A,O;
Matrix Mul(Matrix m1,Matrix m2) {Matrix now;now.clear();for(int i = 1;i <= n;i++) {for(int j = 1;j <= n;j++) {for(int k = 1;k <= n;k++) {now.Ma[i][j] = (now.Ma[i][j] + m1.Ma[i][k] * m2.Ma[k][j]) % m;}}}return now;
}Matrix Add(Matrix m1,Matrix m2) {Matrix now;now.clear();for(int i = 1;i <= n;i++) {for(int j = 1;j <= n;j++) {now.Ma[i][j] = (m1.Ma[i][j] + m2.Ma[i][j]) % m;}}return now;
}
Matrix Qpow(Matrix a,int b) {Matrix now = O;while(b) {if(b & 1) now = Mul(now,a);a = Mul(a, a);b >>= 1;}return now;
}
Matrix dfs(Matrix mat,int k) {if(k == 0) return O;if(k == 1) return mat;Matrix ans;if(k % 2 == 0) {Matrix m1 = dfs(mat,k / 2);ans = Add(m1,Mul(m1, Qpow(mat, k / 2)));} else {Matrix m1 = dfs(mat,k / 2);ans = Add(Qpow(mat,k / 2 + 1),Add(m1,Mul(m1, Qpow(mat, k / 2 + 1))));}return ans;
}
int main() {scanf("%d%d%d",&n,&k,&m);A.clear();for(int i = 1;i <= n;i++) {for(int j = 1;j <= n;j++) {scanf("%d",&A.Ma[i][j]);}}O.init();A = dfs(A,k);for(int i = 1;i <= n;i++) {for(int j = 1;j <= n;j++) {printf("%d ",A.Ma[i][j]);}printf("\n");}return 0;
}

这篇关于AcWing 225. 矩阵幂求和(递归)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/907182

相关文章

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

oracle11.2g递归查询(树形结构查询)

转自: 一 二 简单语法介绍 一、树型表结构:节点ID 上级ID 节点名称二、公式: select 节点ID,节点名称,levelfrom 表connect by prior 节点ID=上级节点IDstart with 上级节点ID=节点值 oracle官网解说 开发人员:SQL 递归: 在 Oracle Database 11g 第 2 版中查询层次结构数据的快速

【AcWing】851. 求最短路

spfa算法其实是对贝尔曼福特算法做一个优化。 贝尔曼福特算法会遍历所有边来更新,但是每一次迭代的话我不一定每条边都会更新,SPFA是对这个做优化。 如果说dist[b]在当前这次迭代想变小的话,那么一定是dist[a]变小了,只有a变小了,a的后继(b)才会变小。 用宽搜来做优化,用一个队列,队列里边存的就是所有变小了的结点(队列里存的是待更新的点)。 基本思路就是我更新过谁,我再拿

1 模拟——67. 二进制求和

1 模拟 67. 二进制求和 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 示例 1:输入:a = "11", b = "1"输出:"100"示例 2:输入:a = "1010", b = "1011"输出:"10101" 算法设计 可以从低位到高位(从后向前)计算,用一个变量carry记录进位,如果有字符没处理完或者有进位,则循环处理。两个字符串对

线性代数|机器学习-P35距离矩阵和普鲁克问题

文章目录 1. 距离矩阵2. 正交普鲁克问题3. 实例说明 1. 距离矩阵 假设有三个点 x 1 , x 2 , x 3 x_1,x_2,x_3 x1​,x2​,x3​,三个点距离如下: ∣ ∣ x 1 − x 2 ∣ ∣ 2 = 1 , ∣ ∣ x 2 − x 3 ∣ ∣ 2 = 1 , ∣ ∣ x 1 − x 3 ∣ ∣ 2 = 6 \begin{equation} ||x

【线性代数】正定矩阵,二次型函数

本文主要介绍正定矩阵,二次型函数,及其相关的解析证明过程和各个过程的可视化几何解释(深蓝色字体)。 非常喜欢清华大学张颢老师说过的一段话:如果你不能用可视化的方式看到事情的结果,那么你就很难对这个事情有认知,认知就是直觉,解析的东西可以让你理解,但未必能让你形成直觉,因为他太反直觉了。 正定矩阵 定义 给定一个大小为 n×n 的实对称矩阵 A ,若对于任意长度为 n 的非零向量 ,有 恒成

Leetcode面试经典150题-128.最长连续序列-递归版本另解

之前写过一篇这个题的,但是可能代码比较复杂,这回来个简洁版的,这个是递归版本 可以看看之前的版本,两个版本面试用哪个都保过 解法都在代码里,不懂就留言或者私信 class Solution {/**对于之前的解法,我现在提供一共更优的解,但是这种可能会比较难懂一些(思想方面)代码其实是很简洁的,总体思想如下:不需要排序直接把所有数放入map,map的key是当前数字,value是当前数开始的

Leetcode67---二进制求和

https://leetcode.cn/problems/add-binary/description/ 给出的两个二进制,我们可以从最后开始往前运算。 给当前短的一位前面补充0即可。 class Solution {public String addBinary(String a, String b) {//给的就是二进制字符串 最后一位开始遍历 如果没有就补充0?StringBuil