uva 11149

题意:给出矩阵,求前k次方和

A^1+A^2+A^3+......A^n=(E+A^(n/2))*(A^1+A^2+.....A^(n/2))

一个式子解决

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define rep(i, j, k) for(int i = j; i <= k; i++)

using namespace std;

int n;

struct matrix
{
	int a[45][45];
}zero, e, a;

matrix operator + (matrix x, matrix y)
{
	matrix ret = zero;
	rep (i, 1, n)
		rep (j, 1, n)
			ret.a[i][j] = (x.a[i][j] + y.a[i][j]) % 10;
	return ret;
}

matrix operator * (matrix x, matrix y)
{
	matrix ret = zero;
	rep (i, 1, n)
		rep (j, 1, n)
			rep (k, 1, n)
				ret.a[i][j] += x.a[i][k] * y.a[k][j], ret.a[i][j] %= 10;
	return ret;
}

matrix power (matrix x, int p)
{
	if (p == 0)
		return e;
	matrix ret = power (x, p / 2);
	if (p % 2)
		return x * ret * ret;
	return ret * ret;
}

matrix pow (matrix x, int p)
{
	if (p == 0)
		return zero;
	int t = p / 2;
	matrix last = pow (x, t);
	last = (e + power (x, t)) * last;
	if (p % 2)
		return last + power (x, p);
	return last;
}

int main ()
{
  
	int m;
	while (scanf ("%d%d", &n, &m) == 2 && n)
	{
		rep (i, 1, n)
			rep (j, 1, n)
				scanf ("%d", &a.a[i][j]), a.a[i][j] %= 10;
		rep (i, 1, n)
			rep (j, 1, n)
				e.a[i][j] = i == j ? 1 : 0;
		rep (i, 1, n)
			rep (j, 1, n)
				zero.a[i][j] = 0;
		matrix ans = pow (a, m);
		for (int i = 1; i <= n; i++, printf ("\n"))
		{
			rep (j, 1, n - 1)
				printf ("%d ", ans.a[i][j] % 10);
			printf ("%d", ans.a[i][n] % 10);
		}
		printf ("\n");
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值