티스토리 뷰

https://www.acmicpc.net/problem/10830

 

10830번: 행렬 제곱

크기가 N*N인 행렬 A가 주어진다. 이때, A의 B제곱을 구하는 프로그램을 작성하시오. 수가 매우 커질 수 있으니, A^B의 각 원소를 1,000으로 나눈 나머지를 출력한다.

www.acmicpc.net

const fs = require('fs');
const input = fs.readFileSync("./dev/stdin").toString().trim().split("\n").map(v=>v.split(' '));

const N = +input[0][0];
const B = BigInt(input[0][1])
const mtrx = input.splice(1).map(v=>v.map(x=>+x%1000));

const answer = powMtrx(mtrx,B).map(v=>v.join(' ')).join('\n')

console.log(answer)


function powMtrx(arr,k){
  if(k==BigInt(1)) return arr
  const temp = powMtrx(arr,k/BigInt(2));
  if(k%BigInt(2)==BigInt(0)){
    return multiMtrx(temp,temp)
  }else{
    return multiMtrx(multiMtrx(temp,temp),arr)
  }
}




function multiMtrx(A,B){
  const C = changeMtrx(B)
  const answer = [];
  for(let i = 0; i<N; i++){
    answer.push([])
    const X = A[i];
    for(let j = 0; j<N; j++){
      let sum = 0;
      const Y = C[j]
      for(let k = 0; k<N; k++){
        sum+=(X[k]*Y[k]);
      }
      answer[answer.length-1].push(sum%1000)
    }
  }
  return answer
}




function changeMtrx(arr){
  const  subMtrx = [];
  for(let i = 0; i<arr.length; i++){
    subMtrx.push([]);
    for(let j = 0; j<arr.length; j++){
      subMtrx[subMtrx.length-1].push(arr[j][i])
    }
  }
  return subMtrx
}
728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함