Backjunアルゴリズム10830回:マトリクス二乗
13074 ワード
リンク
https://www.acmicpc.net/problem/10830
質問する
N*Nの大きさのマトリクスAが与えられる.この場合、AのB乗を求めるプログラムを作成してください.数が大きくなる可能性があるので、A^Bの各要素を1000の残りで割って出力します.
入力
第1行は、行列のサイズNおよびBを与える.(2 ≤ N ≤ 5, 1 ≤ B ≤ 100,000,000,000)
2行目から、行列の各要素をN行に付与する.マトリクス内の各要素は、1000以下の自然数または0です.
しゅつりょく
1行目からN行目までは、出力マトリクスAにBを乗じた結果が出力される.
入力と出力の例
解法
行列...計算するときにやったことをコードで表現すればいいのですが、表現力が足りないので参考にして解答しました.
プールコード(C++)
#include <iostream>
#include <vector>
#define fastio ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
using namespace std;
#define ll long long
typedef vector<vector<ll>> matrix;
const long long mod = 1000;
matrix operator*(const matrix &a, const matrix &b)
{
ll size = a.size();
matrix res(size, vector<ll>(size));
for (ll i = 0; i < size; i++)
{
for (ll j = 0; j < size; j++)
{
for (ll k = 0; k < size; k++)
{
res[i][j] += a[i][k] * b[k][j];
}
res[i][j] %= mod;
}
}
return res;
}
// 행렬 a를 n제곱
matrix power(matrix a, ll n)
{
ll size = a.size();
matrix res(size, vector<ll>(size));
for (ll i = 0; i < size; i++)
{
res[i][i] = 1; // 단위행렬
}
while (n > 0)
{
// n이 홀수이면
if (n % 2 == 1)
{
res = res * a;
}
n /= 2;
a = a * a;
}
return res;
}
void PrintMatrix(const matrix &a)
{
ll size = a.size();
for (ll i = 0; i < size; i++)
{
for (ll j = 0; j < size; j++)
{
cout << a[i][j] << " ";
}
cout << "\n";
}
}
int main()
{
fastio;
ll a, b;
cin >> a >> b;
matrix input(a, vector<ll>(a));
for (ll i = 0; i < a; i++)
{
for (ll j = 0; j < a; j++)
{
cin >> input[i][j];
}
}
PrintMatrix(power(input, b));
return 0;
}
コメントブログhttps://seokjin2.tistory.com/9?category=759919
(ソースを参照)
Reference
この問題について(Backjunアルゴリズム10830回:マトリクス二乗), 我々は、より多くの情報をここで見つけました https://velog.io/@inwooleeme/백준-알고리즘-10830번-행렬-제곱テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol