# POJ - 3233 Matrix Power Series

1635人阅读 评论(0)

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 nnonnegative 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 4
0 1
1 1

Sample Output

1 2
2 3

#include<iostream>
using namespace std;

int n, k, m;
long long in[30][30];
long long list[30][30];
long long temp[30][30];
long long sum[30][30];

void pro(long long l1[][30], long long l2[][30], long long t[][30])	//t=l1*l2
{
for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)
{
t[i][j] = 0;
for (int k = 0; k < n; k++)t[i][j] = (t[i][j] + l1[i][k]%m * l2[k][j]%m) % m;
}
}

void f(int num)		//list=in^num
{
if (num == 1)
{
for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)
			list[i][j] = in[i][j] % m;
return;
}
f(num / 2);
pro(list, list, temp);
if (num % 2)pro(temp, in, list);
else for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)list[i][j] = temp[i][j];
}

void getsum(int num)
{
if (num == 1)
{
for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)sum[i][j] = in[i][j]%m;
return;
}
getsum(num / 2);
f(num / 2);
pro(sum, list, temp);
for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)
		sum[i][j] = (sum[i][j] + temp[i][j]) % m;
if (num % 2)
{
pro(sum, in, temp);
for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)
			sum[i][j] = (temp[i][j] + in[i][j]) % m;
}
}

int main()
{
cin >> n >> k >> m;
for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)cin >> in[i][j];
getsum(k);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (j)cout << " ";
cout << sum[i][j];
}
cout << endl;
}
return 0;
}

S（k）=S（k-1）*A +A

S（k）=CA

#include<iostream>
using namespace std;

int n, k, m;
long long in[60][60];
long long list[60][60];
long long temp[60][60];

void pro(long long l1[][60], long long l2[][60], long long t[][60])	//t=l1*l2
{
for (int i = 0; i < n*2; i++)for (int j = 0; j < n*2; j++)
{
t[i][j] = 0;
for (int k = 0; k < n * 2; k++)t[i][j] = (t[i][j] + l1[i][k] * l2[k][j]) % m;
}
}
void f(int num)		//list=in^num
{
if (num == 0)
{
for (int i = 0; i < n*2; i++)for (int j = 0; j < n*2; j++)
			list[i][j] = (i == j);
return;
}
f(num / 2);
pro(list, list, temp);
if (num % 2)pro(temp, in, list);
else for (int i = 0; i < n*2; i++)for (int j = 0; j < n*2; j++)list[i][j] = temp[i][j];
}

int main()
{
cin >> n >> k >> m;
for (int i = 0; i < n * 2; i++)for (int j = 0; j < n * 2; j++)
		in[i][j] = (i == j || i+n == j );
for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)cin >> in[i][j];
f(k);
long long r;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (j)cout << " ";
r = 0;
for (int k = 0; k < n; k++)r += list[i][k + n] * in[k][j];
cout << r%m;
}
cout << endl;
}
return 0;
}

0
0

个人资料
• 访问：1072826次
• 积分：19315
• 等级：
• 排名：第537名
• 原创：786篇
• 转载：0篇
• 译文：0篇
• 评论：114条
博客专栏
 Linux（内核）基础 文章：18篇 阅读：5120
 python入门 文章：10篇 阅读：10256
 BAT等名企面试笔试题 文章：31篇 阅读：61757
 ACM中的数论 文章：52篇 阅读：76250
 程序员需要的逻辑思维 文章：286篇 阅读：488815
 ACM入门专栏 文章：228篇 阅读：361352