2385 - Multiplicação de Matrizes
Esse é um exemplo claro onde a descrição faz parecer que o problema é muito mais difícil do que ele realmente é.
Descrição
Solução
Um bom jeito de começar a solucionar problemas é em vez de focar nas possibilidades de resolução, focar com quais limitações nossa solução vai ter que lidar. Por exemplo, neste problema, as matrizes envolvidas tem tamanho máximo 10000 x 10000, o que é impossível de representar nos computadores atuais. Logo, agora temos uma dica de que não será necessário construir as matrizes completas A e B para resolver o problema.
Com isso, vem a pergunta: ué, mas se não podemos construir as matrizes, como vamos calcular o resultado na matriz C? Daí podemos ver que o problema na verdade não pede para imprimirmos a matriz C, ele só pede para que imprimamos um elemento específico situado em uma coordenada específica da matriz C, o que torna nosso problema muito mais fácil.
Mas como que vamos descobrir o valor do elemento específico sem saber a matriz inteira? Basta lembrar de como multiplicação de matrizes funciona na prática. Para toda matriz A e B quadrada de dimensões iguais, podemos calcular um elemento da matriz C na posição (i, j) da seguinte forma:
Com isso, basta apenas calcularmos este somatório para todos os valores de k para conseguirmos nossa resposta, só prestando atenção a dois detalhes importantes:
A resposta pode dar overflow, então utilize inteiros com capacidade maior para armazenar a resposta;
Os índices vão de 1 até N.
#include <stdio.h>
int main(){
long long int resposta;
int N, P, Q, R, S, X, Y, I, J;
scanf("%d\n", &N);
scanf("%d %d %d %d %d %d\n", &P, &Q, &R, &S, &X, &Y);
scanf("%d %d", &I, &J);
resposta = 0;
for(int k = 1; k <= N; ++k){
resposta += ((P * I + Q * k) % X) * ((R * k + S * J) % Y);
}
printf("%lld\n", resposta);
return 0;
}
Last updated
Was this helpful?