POJ3233 矩阵的N次幂求和 二分

原创 2012年03月30日 15:10:22

k 为偶数:A^k = A ^(k/2) * A ^(k/2);

k 为奇数: A^k = A ^ (k/2) * A^(k/2) * A

  

n  = 2k 为偶数

A^1 + A^2 + A^3 +....... A^(2k) = (A + A^2 + A^3 + .....A ^ k) + A^k * (A + A^2 + A^3 + .....A ^ k);


n = 2k + 1为奇数

A^1 + A^2 + A^3 +....... A^(2k + 1) = (A + A^2 + A^3 + .....A ^ k) +A ^(k + 1) + A^(k + 1) * (A + A^2 + A^3 + .....A ^ k);


#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
struct MATRIX
{
	int m[35][35];
};
int m;
MATRIX MOD(MATRIX num1,int n)
{
	int i,j;
	MATRIX res;
	for(i = 0; i < n; i++)
	{
		for(j = 0; j < n; j++)
		{
			res.m[i][j] = res.m[i][j]  %  m;
			
		}
	}
	return res;
}
MATRIX  mul(MATRIX num1, MATRIX num2,int n)
{
	int x;
	int i,j;
	MATRIX res;
	memset(&res,0,sizeof(res));
	for(i = 0; i <n; i++)
	{
		for(j = 0; j < n; j++)
		{
			for(x = 0; x < n; x++)
			{
				res.m[i][j] += (num1.m[i][x] * num2.m[x][j]) % m;
				res.m[i][j] %= m;
			
			}
		}
	}

	return res;
}
MATRIX sum(MATRIX num1,MATRIX  num2, int n)
{
	int i,j;
	MATRIX result;
	for(i = 0; i < n; i++)
	{
		for(j = 0; j < n; j++)
		{
			result.m[i][j] = (num1.m[i][j] + num2.m[i][j]) % m;
			
		}
	}
	return result;//Why not res
}
MATRIX POW(MATRIX mat,int n,int t)
{
	if(t == 1)
	{
		return  mat;

	}
	MATRIX res;
	if(t % 2 == 0)
	{
		res = POW(mat,n, t/2);
		MATRIX current;
		memcpy(¤t, &res, sizeof(res));

		res = mul(current,res,n);
	}
	else
	{
		res = POW(mat,n,t/2);
		res = mul(res,res,n);
		res = mul(res,mat,n);	
	}
	return res;

}
MATRIX total(MATRIX mat,int k,int n)
{
	MATRIX current;
	MATRIX res;
	if(k == 1)
	{
		return mat;
	}
	if(k % 2 == 0)
	{
		current = total(mat,k/2,n);
		res = sum(current,mul(current , POW(mat,n,k/2),n),n);
		return res;

		
	}
	else
	{
		current = total(mat,k/2,n);
		  MATRIX flag = POW(mat,n,k/2 + 1);
		  MATRIX flag1;
		  flag1 = sum(current, flag,n);
		  res = sum(flag1,mul(flag,current,n),n);
		  return res;
	}
	

}
int main()
{
	int n,k;
	while(scanf("%d %d %d",&n,&k,&m) != EOF)
	{
		MATRIX num;
		MATRIX res;
		memset(&num,0,sizeof(num));
		memset(&res,0,sizeof(res));

		int i,j;
		for(i = 0; i < n; i++)
		{
			for(j = 0; j < n; j++)
			{
				scanf("%d",&num.m[i][j]);
			}
		}
		MOD(num, n);
		res = total(num, k,n);
		MOD(num, n);
			for(i = 0; i < n; i++)
		{
			for(j = 0; j < n; j++)
			{
				printf("%d%c",res.m[i][j],j != n-1? ' ':'\n');
			}
		}
	}
	return 0;
}


poj 3233 Matrix Power Series(矩阵快速幂+二分求和)

题意: 给定一个n*n的矩阵A,要求(A+A^2+....A^K)%m后的矩阵 解析: 对于任意的A^x,我们都能够利用矩阵快速幂求出,但是我们现在要求的是和。 仔细观察整个式子,那么我们可以对...
  • hlmfjkqaz
  • hlmfjkqaz
  • 2013年11月19日 21:02
  • 694

求矩阵的n次方 快速幂

矩阵的快速幂是用来高效地计算矩阵的高次方的。将朴素的o(n)的时间复杂度,降到log(n)。 这里先对原理(主要运用了矩阵乘法的结合律)做下简单形象的介绍: 一般一个矩阵的n次方,...
  • puppylpg
  • puppylpg
  • 2015年04月19日 19:07
  • 3006

矩阵乘法(蓝桥杯试题)

矩阵乘法(蓝桥杯试题)问题描述 给定一个N阶矩阵A,输出A的M次幂(M是非负整数) 例如:   A =   1 2   3 4   A的2次幂   7 10   15 22输入格式 ...
  • bb2210083
  • bb2210083
  • 2016年02月19日 11:57
  • 453

矩阵快速幂的JAVA实现

矩阵快速幂题目描述:给定一个n*n的矩阵,求该矩阵的k次幂,即P^k。**如何快速的算出一个矩阵的N次幂呢,举个例子,比如A^19 => (A^16)*(A^2)*(A^1)显然采取这样的方式计算时...
  • Rzty_it
  • Rzty_it
  • 2017年02月10日 21:36
  • 980

矩阵乘法---蓝桥杯

import java.util.Scanner; public class matrixMul{ public static void main(String[] args) { int N,...
  • kerrylovelj
  • kerrylovelj
  • 2014年10月27日 13:59
  • 1029

蓝桥杯:矩阵乘法

题目: 给定一个N阶矩阵A,输出A的M次幂(M是非负整数)   例如:   A =   1 2   3 4   A的2次幂   7 10   15 22 输入格式   第一行是一个正整数N、M(1  ...
  • JDOUN
  • JDOUN
  • 2016年03月05日 13:07
  • 1863

如何判断一个数是不是2的n次幂

题目:给定一个整数num,判断这个整数是否是2的N次方。比如,2,4,8是2的那次方,6,10不是2的N次方。 请看下面的程序: public static bool Check1(int...
  • jbfsdzpp
  • jbfsdzpp
  • 2015年10月20日 16:56
  • 1264

2的N次幂表示

问题描述   任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001。   将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面,可得到如下表达式:137=2^7+2^...
  • xukun5137
  • xukun5137
  • 2015年06月03日 18:47
  • 704

poj3233 等比矩阵二分求和

题意:给定矩阵A 求A+A^2+A^3+.......+A^k 如何转化 令SUM(k)==A+A^2+A^3+.......+A^k 则SUM(k)=(1 + A^(k/2) )  ...
  • hyc10
  • hyc10
  • 2017年05月19日 21:11
  • 77

2的n次幂的Java实现

首先扯点别的:今天上海下雨了,不大,空气很清新,温度也很舒适,今晚可以睡个好觉了。 今天总结一些2的n次幂的算法实现,只讨论n>=0的情况。 如果n比较小的话,可以这样实现。 private s...
  • leilifengxingmw
  • leilifengxingmw
  • 2017年05月24日 08:57
  • 1082
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ3233 矩阵的N次幂求和 二分
举报原因:
原因补充:

(最多只允许输入30个字)