码迷,mamicode.com
首页 > 其他好文 > 详细

北大ACM3233——Matrix Power Series

时间:2015-08-02 18:19:46      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:北大   acm   

题目的意思:计算矩阵S = A + A^2 + A^3 + ..... + A^k。A为n*n的矩阵。

一个一个计算,然后相加,由于k最大为10^9,所以会超时。

可以令S(k) = I + A + A^2 + ....+ A^(k-1).

可以推出:S(k) = S(k - 1) + A^(k - 1)。

进一步推出:

技术分享

矩阵 I 为

技术分享(I的大小随n的变化而变化)

下面的是AC的代码:

#include <iostream>
#include <vector>
using namespace std;

typedef vector<int>vec;
typedef vector<vec>mat;

int n, k, m;
mat a(31, vec(31));

mat mul(mat &A, mat &B)            //矩阵相差
{
	mat C(A.size(), vec(B[0].size()));
	for(int i = 0; i < A.size(); i++)
		for(int k = 0; k < B.size(); k++)
			for(int j = 0; j < B[0].size(); j++)
				C[i][j] = (C[i][j] + A[i][k] * B[k][j]) % m;
	return C;
}
mat pows(mat A, int x)               //快速幂运算
{
	mat B(A.size(), vec(A.size()));
	for(int i = 0; i < A.size(); i++)    // 初始化
		B[i][i] = 1;
	while(x > 0)
	{
		if(x & 1)
			B = mul(B, A);
		A = mul(A, A);
		x >>= 1;
	}
	return B;
}


int main()
{
	int i, j;
	cin >> n >> k >> m;
	{
		mat B(n * 2, vec(n * 2));
		for(i = 0; i < n; i++)
		{
			for(j = 0; j < n; j++)
			{
				scanf("%I64d", &a[i][j]);
				B[i][j] = a[i][j];
			}
			B[n + i][i] = B[n + i][n + i] = 1;//初始化下面的I
		}
		B = pows(B, k + 1);              //I + A + A^2 + .... + A^n
		for(i = 0; i < n; i++)
		{
			for(j = 0; j < n; j++)
			{
				int b = B[n + i][j] % m;
				if(i == j)              //减掉I
					b = (b + m - 1) % m;
				cout << b;
				j != n - 1 ? cout << ' ' : cout << endl;
			}
		}
	}
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

北大ACM3233——Matrix Power Series

标签:北大   acm   

原文地址:http://blog.csdn.net/qq_25425023/article/details/47208603

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!