リソース制限
制限時間:1.0秒メモリ制限:512.0MB
問題の説明
N次の行列Aが与えられた場合、AをM乗で出力します(Mは負の整数ではありません)
例:
A =
1 2
3 4A
の2乗
710
15 22入力フォーマット
最初の行は正の整数N、M(1 <= N <= 30、0 <= M <= 5)で、行列Aの次数と必要な電力を表します。
次のN行は、それぞれNの絶対値を持ちます。行列Aの値を表す10を超えない非負の整数出力フォーマット
出力には合計N行があり、各行にはN個の整数があり、AのM乗に対応する行列を表します。スペースを使用して隣接する番号を区切ります
サンプル入力
2 2
1 2
3 4サンプル出力
7 10
15 22
アイデア:
行列積:ほぼ意味:
栗を与える:n = 2のとき;
最初の数は、最初の水平線の数と最初の垂直線の数であり、これらは対応して乗算および加算されます。
最初の数字と同じ行の2番目の数字は、最初の水平線と2番目の垂直線の対応する乗算と加算でもあります。
3番目の数値は、最初の2つの数値と同じ行にはありません。これは、計算できるすべての垂直行を丸めるのは最初の行の数値だからです。したがって、2番目の水平線と最初の垂直線の計算を開始してから、2番目の垂直線を計算します。この水平線も計算されるまで。
Baiduの写真は次のようになります:(参照)
Aの順序、これは次のことを意味します。
レベル0の場合:対角線は1です。他の位置は0です。
レベル1の時:それ自体のために
2番目のレベル:上記に従ってください。
3次:行列積を計算するための2次計算数と1次
4次:3次結果と1次計算
.....。
一般的な考え方を理解したので、コードシミュレーションを始めましょう(* ^▽^ *)
実装コード:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
int i,j,k,z;
int a[35][35],b[35][35],c[35][35];
cin>>n>>m;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cin>>a[i][j];//输入
b[i][j]=a[i][j];
c[i][j]=0;//初始化
}
}
if(m==0)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i==j)
b[i][j]=1;
else
b[i][j]=0;
}
}
}
else if(m==1)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
b[i][j]=a[i][j];
}
}
}
else if(m>=2)
{
for(z=2;z<=m;z++)
{
for(i=1;i<=n;i++)//横行
{
for(j=1;j<=n;j++)//竖行
{
for(k=1;k<=n;k++)//第几个数
{
c[i][j]+=a[i][k]*b[k][j];
}
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
b[i][j]=c[i][j];
c[i][j]=0;
}
}
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
printf("%d ",b[i][j]);
}
printf("\n");
}
return 0;
}