Matrix Power Series 【Matrix Multiplication】

Limite de tempo: 3000MS Limite de memória: 131072K
Total de envios : 35006 Aceitos: 14029


Descrição

Dado um n × nn × nn×n matriz A e um inteiro positivo k, encontre a somaS = A + A 2 + A 3 +… + A k S = A + A2 + A3 +… + AkS=UMA+A 2+A 3++A k .


Entrada

A entrada contém exatamente um caso de teste. A primeira linha de entrada contém três inteiros positivos n (n ≤ 30), k (k ≤ 109) em (m <104). Em seguida, siga n linhas, cada uma contendo n inteiros não negativos abaixo de 32.768, fornecendo os elementos de A na ordem da linha maior.

Resultado

Produza os elementos do módulo S da mesma forma que A é fornecido.


Amostra de entrada

2 2 4
0 1
1 1

Saída de amostra

1 2
2 3


Tradução de tópicos

Dado um n × nn × nn×matriz de n a e um inteiro positivo k, somaS = a + A 2 + A 3 + ... + A k S = a + A2 + A3 + ... + AkS=uma+A 2+A 3++A k

A entrada
contém apenas um caso de teste. A primeira linha de entrada contém três inteiros positivos n (n ≤ 30), k (k ≤ 1 0 9) em (m <1 0 4) n (n ≤ 30), k (k ≤ 10 ^ 9) em (m <10 ^ 4)n n3 0 k k1 09 )em(m<1 04 ). Em seguida, siga n linhas, cada linha contém32768 32768Para n inteiros não negativos abaixo de 3 2 7 6 8 , os elementos de A são dados na ordem principal da linha.

Saída Produza
os elementos do módulo S da mesma maneira que A.


Ideias para resolução de problemas

Multiplicação da matriz

Considere 1 × 2 1 × 21×Matriz de 2 [A n - 1, S [n - 2]] [A ^ n-1, S [n-2]]An-1 ,S [ n-2 ] , observe que os 2 elementos desta matriz 1 × 2 são todas matrizes quadradas de ordem r! Esperamos obter uma matriz 1 × 2[A n, S [n - 1]] = [A n - 1 ∗ A, A n - 1 + S [n - 2]multiplicando por uma certa matriz 2 × 2 M】 【A ^ n, S [n-1]】 = 【A ^ n-1 * A, An-1 + S [n-2]】An ,S [ n-1 ] An-1A ,A n-1+S [ n-2 ] ] É
fácil construir esta matriz M como:
Insira a descrição da imagem aqui
onde 4 elementos são todas matrizes quadradas de ordem r, O significa uma matriz de todos os 0s de ordem r, e E significa uma matriz de identidade (1 na diagonal principal, e todos 0 por outro).
problema resolvido. Nossa complexidade é:(2 r) 3 ∗ logn (2r) 3 * logn( 2 r ) 3l o g n

Na verdade, essa matriz é usada nesse método popular. Aqui podemos construir facilmente este 2 r ∗ 2 r 2r * 2r usando as idéias das questões anteriores.2 r2 matriz r . Portanto: esta ideia é eficiente, geral, unificada e harmoniosa!


Código

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
long long nn,k,mm;
struct c{
    
    
	long long n,m;
	long long a[100][100];
}A,B,CC;
c operator *(c A,c B){
    
    
	c C;
	C.n=A.n,C.m=B.m;
	for(int i=1;i<=C.n;i++)
		for(int j=1;j<=C.m;j++)
			C.a[i][j]=0;
	for(int k=1;k<=A.m;k++)
	{
    
    
		for(int i=1;i<=C.n;i++)
			for(int j=1;j<=C.m;j++)
				C.a[i][j]=(C.a[i][j]+(A.a[i][k]*B.a[k][j])%mm)%mm;
	}	
	return C;
}
void poww(long long x){
    
    
	if(x==1)
	{
    
    
		B=A;
		return; 
	}
	poww(x>>1);
	B=B*B;
	if(x&1)
		B=B*A;
	
}
int main(){
    
    
	scanf("%lld%lld%lld",&nn,&k,&mm);
	CC.n=nn,CC.m=2*nn;
	A.n=2*nn,A.m=2*nn;
	for(int i=1;i<=nn;i++)
		for(int j=1;j<=nn;j++)
		{
    
    
			scanf("%lld",&CC.a[i][j]);
			CC.a[i][j]=CC.a[i][j]%mm;
			A.a[i][j]=CC.a[i][j];
		}	
	for(int i=1;i<=nn;i++)
		for(int j=nn+1;j<=2*nn;j++)
			if(j-nn==i)
				A.a[i][j]=1;	
	for(int i=nn+1;i<=2*nn;i++)
		for(int j=nn+1;j<=2*nn;j++)
			if(j==i)
				A.a[i][j]=1;
	poww(k);
	CC=CC*B;
	
	for(int i=1;i<=nn;i++)
	{
    
    
		for(int j=nn+1;j<=2*nn;j++)
			printf("%lld ",CC.a[i][j]);
		printf("\n");
	}		
}

Acho que você gosta

Origin blog.csdn.net/kejin2019/article/details/111074044
Recomendado
Clasificación