博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【POJ 3233】矩阵多项式和 - 快速幂
阅读量:4940 次
发布时间:2019-06-11

本文共 2703 字,大约阅读时间需要 9 分钟。

题目介绍:

Matrix Power Series
Time Limit: 3000MS   Memory Limit: 131072K
Total Submissions: 25225   Accepted: 10427

Description

Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + … + Ak.

Input

The input contains exactly one test case. The first line of input contains three positive integers n (n ≤ 30), k (k ≤ 109) and m (m < 104). Then follow n lines each containing n nonnegative integers below 32,768, giving A’s elements in row-major order.

Output

Output the elements of S modulo m in the same way as A is given.

Sample Input

2 2 40 11 1

Sample Output

1 22 3
#include
#include
#include
#include
using namespace std;const int MAX_N = 220;int E[MAX_N][MAX_N];int M;class Mat {public: Mat(int N, int N2) { vc.resize(N); for (int i = 0; i < N; i++) { vc[i].resize(N2); } } vector
& operator[](int idx) { return vc[idx]; } int size() { return vc.size(); }private: vector
> vc;};void multiply(Mat& CP, Mat& B, Mat& D) { memset(E, 0, sizeof(E)); for (int i = 0; i < B.size(); i++) { for (int j = 0; j < B[0].size(); j++) { for (int k = 0; k < D.size(); k++) { // printf("prev, %d %d %d %d\n", E[i][j], B[i][k], D[k][j], B[i][k] * D[k][j]); E[i][j] = (E[i][j] + B[i][k] * (D[k][j] % M)) % M; // printf("last, %d %d %d %d\n", E[i][j], B[i][k], D[k][j], B[i][k] * D[k][j]); } } } for (int i = 0; i < B.size(); i++) { for (int j = 0; j < D[0].size(); j++) { CP[i][j] = E[i][j]; } }}void debug(Mat& E, int N, int C) { for (int i = 0; i < N; i++) { for (int j = 0; j < C; j++) { printf("%d ", E[i][j]); } printf("\n"); } printf("\n");}void mpow(Mat& B, int k) { int N = B.size(); if (N == 0) { return; } int C = B[0].size(); Mat cp(N, C); for (int i = 0; i < N; i++) { cp[i][i] = 1; } while (k) { if (k & 1) { // cp = cp * B^(2^k) multiply(cp, cp, B); } multiply(B, B, B); k = k >> 1; } for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { B[i][j] = cp[i][j]; } }}int main() { int n, k; int A[MAX_N][MAX_N]; while (cin >> n >> k >> M) { Mat B(n * 2, n * 2); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> A[i][j]; } } // copy Mat to be: // | A | 0 | // | I | I | // for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { B[i][j] = A[i][j]; } B[n + i][i] = B[n + i][n + i] = 1; } mpow(B, k + 1); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { int a = B[n + i][j] % M; if (i == j) a = (a + M - 1) % M; printf("%d%c", a, j == n - 1 ? '\n' : ' '); } } } return 0;}

 

转载于:https://www.cnblogs.com/wangzming/p/8207379.html

你可能感兴趣的文章
Rap框架练习
查看>>
补充“为什么Scrum不行”
查看>>
IT职场人生系列之八:行业与公司类型
查看>>
敏捷开发生态系统系列之一:序言及需求管理生态(客户价值导向-可工作软件-响应变化)...
查看>>
敏捷开发生态系统系列之二:敏捷生态系统-计划跟踪 I(跨职能团队-共同估算-每日立会-同行压力)...
查看>>
MVC的Controller-Action布局:单独的创建/编辑页面还是创建/编辑/查看一体的页面?...
查看>>
RAP框架练习(续)
查看>>
敏捷开发生态系统系列之三:计划跟踪II(需求优先级排序-迭代期内无变更-团队承诺)...
查看>>
当程序员,你应该懂的法则
查看>>
面试—每日一题(8)
查看>>
asp.net怎样在URL中使用中文、空格、特殊字符
查看>>
敏捷开发生态系统系列之四:计划跟踪II(自组织团队-开发团队自己估算-PO挑战估算-同行压力)...
查看>>
《火星人敏捷开发手册》 2011-08-18版本发布
查看>>
为什么我们程序员难晋升
查看>>
敏捷开发绩效管理之二:用中医理论管理团队及其绩效(绩效考核,团队管理,自组织团队)...
查看>>
敏捷开发绩效管理之一:序言及“敏捷开发是否考核个人”(绩效考核)
查看>>
敏捷开发绩效管理之三:个体动力之源——同行压力(松结对编程,师徒制度,跨职能团队,绩效考核)...
查看>>
敏捷开发绩效管理之四:为团队设立外部绩效目标(目标管理,外向型绩效)...
查看>>
智能指针之auto_ptr
查看>>
敏捷开发绩效管理之五:敏捷开发生产率(上)(故事点估算)
查看>>