您的位置:首页 > 其它

矩阵乘法的应用

2010-11-02 12:31 225 查看
一、学习资料


Blog1, Blog2,

论文1 -> 俞华程《矩阵乘法在信息学中的应用》

二、题目

1. hdoj-1575

描述:求矩阵A^k的主对角线元素和 (mod 9973).

PS: 入门题[二分求矩阵幂]

代码

#include <stdio.h>
#include <string.h>
#define NL 30

int n, md;

class Matrix {
public:
int v[NL][NL];

Matrix() {
memset(v, 0, sizeof (v));
}

Matrix & operator =(const Matrix &m) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
this->v[i][j] = m.v[i][j];
}
return *this;
}

Matrix Multiply(Matrix m) {
Matrix m1;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
m1.v[i][j] += v[i][k] * m.v[k][j];
m1.v[i][j] %= md;
}
}
}
return m1;
}

Matrix Add(Matrix m) {
Matrix m1;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
m1.v[i][j] = (v[i][j] + m.v[i][j]) % md;
}
}
return m1;
}

Matrix Pow(int k) {
Matrix m1, m0;
m1 = m0 = *this;
k--;
while (k > 0) {
if (k & 1) m1 = m1.Multiply(m0);
m0 = m0.Multiply(m0);
k >>= 1;
}
return m1;
}

void Print() {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
printf("%d ", v[i][j]);
printf("\n");
}
}
};
Matrix m0, m1;

Matrix cal(int k) {
Matrix m;
if (k == 1) return m0;
if (k & 1) {
Matrix mx = cal(k / 2);
Matrix my = m0.Pow(k / 2 + 1);
return mx.Add(mx.Multiply(my).Add(my));
} else {
Matrix mx = cal(k / 2);
Matrix my = m0.Pow(k / 2);
return mx.Add(my.Multiply(mx));
}
}

int main() {
int k;
scanf("%d%d%d", &n, &k, &md);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
scanf("%d", &m0.v[i][j]), m0.v[i][j] %= md;
}
m1 = cal(k);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%d%c", m1.v[i][j], (j == n - 1) ? '\n' : ' ');
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: