zoukankan      html  css  js  c++  java
  • 九度 1474:矩阵幂(二分法)

    题目描述:

    给定一个n*n的矩阵,求该矩阵的k次幂,即P^k

    思路

    1. 和求解整数幂的思路相同, 使用分治策略, 代码的框架是

    int pow(a, b) {

      c = pow(a, b/2)

      c*= c;

      if(b 为奇数)

        c *= a;

      return c

    }

    2. 这道题求的是矩阵, 上面的框架不太好用, 毕竟返回一个矩阵是有点不靠谱. 既然显式的返回矩阵不行, 那就玩个把戏, 隐式返回.

    将矩阵设置为全局变量, 使得递归函数里对矩阵的操作全局有效, 就不需要显式返回矩阵了

    3. 尝试仅使用两个矩阵得出结果, 但失败了, 计算矩阵乘法, 至少需要三个矩阵的空间吧

    代码

    #include <iostream>
    #include <stdio.h>
    using namespace std;
    
    int matrix1[12][12];
    int matrix2[12][12];
    int matrix3[12][12];
    
    int n, k;
    
    void multimatrix(int x) {
        if(x == 1)
            return;
    
        multimatrix(x/2);
    
        for(int i = 0; i < n; i ++) {
            for(int j = 0; j < n; j ++) {
                int grid = 0;
                for(int k = 0; k < n; k ++) {
                    grid += matrix2[i][k]*matrix2[k][j];
                }
    
                matrix3[i][j] = grid;
            }
        }
    
        for(int i = 0; i < n; i ++) {
            for(int j = 0; j < n; j ++) {
                matrix2[i][j] = matrix3[i][j];
            }
        }
    
        if(x&1) {
            for(int i = 0; i < n; i ++) {
                for(int j = 0; j < n; j ++) {
                    int grid = 0;
                    for(int k = 0; k < n; k ++) {
                        grid += matrix2[i][k]*matrix1[k][j];
                    }
                    matrix3[i][j] = grid;
                }
            }
            for(int i = 0; i < n; i ++) {
                for(int j = 0; j < n; j ++) {
                    matrix2[i][j] = matrix3[i][j];
                }
            }
        } 
    }
    
    int main() {
        int t;
        scanf("%d", &t);
        for(int i = 0; i < t; i ++) {
            scanf("%d%d", &n, &k);
    
            for(int i = 0; i < n; i ++) {
                for(int j = 0; j < n; j ++) {
                    scanf("%d", &matrix1[i][j]);
                    matrix2[i][j] = matrix1[i][j];
                }
            }
    
            multimatrix(k);
    
            for(int i = 0; i < n; i ++) {
                printf("%d", matrix2[i][0]);
                for(int j = 1; j < n; j ++) {
                    printf(" %d", matrix2[i][j]);
                }
                printf("
    ");
            }
        }
        return 0;
    }
  • 相关阅读:
    day1-python简介+安装
    dgango中admin下添加搜索功能
    调用zabbix 分组api
    python 调用zabbix api实现查询主机信息,输出所有主机ip
    python实现用户登录界面
    怎样过滤跨站恶意脚本攻击(XSS)
    java服务安装(一):使用java service wrapper及maven打zip包
    详解Maven项目利用java service wrapper将Java程序生成Windows服务
    使用tomcat7-maven-plugin部署Web项目
    常用Maven插件介绍
  • 原文地址:https://www.cnblogs.com/xinsheng/p/3586815.html
Copyright © 2011-2022 走看看