Coque TJOI2017 (Quick Matrix Power)

Descripción

El robot comienza en 1 1En la 1ª ciudad. El robot tiene tres comportamientos: permanecer en el lugar, al lado de la siguiente ciudad y autodestruirse. Desencadena aleatoriamente un comportamiento cada segundo. Ahora da la foto, pregunta porttEn t segundos, ¿cuál es el número de acciones del robot?

1 <t ≤ 1 0 9, 1 ≤ N ≤ 30, 0 <M <100 1 <t \ leq 10 ^ {9}, 1 \ leq N \ leq 30,0 <M <100 1<t1 09 ,1norte3 0 ,0<METRO<1 0 0

Solución

El mapa es muy pequeño, primero cree la matriz de adyacencia. Para detenerse en su lugar, sea fi, i = 1 f_ {i, i} = 1Fi , i=1. Para la autodestrucción, se puede construir un nodo virtual0 00 , luego deje que todos los puntos se conecten con unborde dirigido, es decir,fi, 0 = 1 f_ {i, 0} = 1Fi , 0=1

Considere el proceso de dp, sea gi, j, k g_ {i, j, k}gramoi , j , kPara esclavo iiyo ajjj se ha idokkEl número de planes de k- pasos, puede encontrarkkLa dimensión k se puede quitar. Entonces el estado inicial esgi, j = fi, j g_ {i, j} = f_ {i, j}gramoi , j=Fi , j. Utilice las ideas de Floyd y transfiéralas a

fi, j = ∑ k = 1 nfi, k × fk, j f_ {i, j} = \ sum_ {k = 1} ^ n f_ {i, k} \ times f_ {k, j} Fi , j=k = 1nFi , k×Fk , j

Se puede encontrar que esta es una multiplicación de matrices, por lo que la matriz se expone rápidamente.

Complejidad temporal O (n 3 log ⁡ t) O (n ^ 3 \ log t)O ( n3lo gt )

Código

Cuelgue una plantilla para una matriz de potencia rápida

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 100 + 5, INF = 0x3f3f3f3f, mod = 1e9 + 7;
inline int read() {
    
    
	int x = 0, f = 0; char ch = 0;
	while (!isdigit(ch)) f |= ch == '-', ch = getchar();
	while (isdigit(ch)) x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();
	return f ? -x : x;
}
int n;
struct mat {
    
    
	int m[N][N];
	mat() {
    
    
		memset(m, 0, sizeof(m));
		for (int i = 0; i < N; i++) m[i][i] = 1;
	}
};


mat mul(mat a, mat b) {
    
    
	mat c;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++) {
    
    
			c.m[i][j] = 0; //Mention! 
			for (int k = 1; k <= n; k++) 
				c.m[i][j] += a.m[i][k] * b.m[k][j] % mod;
			c.m[i][j] %= mod;	
		}
	return c;
}
mat ksm(mat a, int k) {
    
    
	mat res;
	while (k) {
    
    
		if (k & 1) res = mul(res, a);
		k >>= 1;
		a = mul(a, a);
	}
	return res;
}
signed main() {
    
    
	n = read(); int k = read();
	
	mat a; 
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			a.m[i][j] = read();
	mat ans = ksm(a, k);
	for (int i = 1; i <= n; i++) {
    
    
		for (int j = 1; j <= n; j++)
			printf("%lld ", ans.m[i][j]);
		puts("");
	}		
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_39984146/article/details/107863056
Recomendado
Clasificación