Задача
Следом квадратной матрицы называется сумма элементов, расположенных на главной диагонали.
Даны квадратная матрица порядка m, натуральное число n. Вычислить следы матриц [latex]A, A^{2}, … , A^{n}[/latex].
Тесты
[latex]m[/latex] | [latex]n[/latex] | [latex]A[/latex] | следы [latex]A, A^{2}, … , A^{n}[/latex] | Комментарий |
3 | 4 | [latex]\begin{pmatrix} 1 & 2 & 3\\ 1 & 2& 3 \\ 1 & 2 & 3 \end{pmatrix}[/latex] | 6 36 216 1296 | Пройден |
2 | 5 | [latex]\begin{pmatrix} 1 & 2\\ 3 & 4 \end{pmatrix}[/latex] | 5 29 155 833 4475 | Пройден |
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
#include <iostream> using namespace std; int main() { int m,n; cin >> m >> n; int A[m][m]; //массив для хранения исходной матрицы int B[m][m]; //массив для хранения степеней исходной матрицы int C[m][m]; //массив для хранения произведений A на B при возведении в степень for(int i=0;i<m;i++) { for(int j=0;j<m;j++) { cin >> A[i][j]; B[i][j]=A[i][j]; } } int sum=0; int result=0; if(n>0) { for(int i=0;i<m;i++) { result+=B[i][i]; //нахождение следа исходной матрицы } cout << result << " "; } for(int q=0;q<n-1;q++) { for(int i=0;i<m;i++) //перемножение матриц { for(int z=0;z<m;z++) { for(int j=0;j<m;j++) { sum+=A[i][j]*B[j][z]; } C[i][z]=sum; sum=0; } } for(int i=0;i<m;i++) //переприсваивание элементов матрицы { for(int j=0;j<m;j++) { B[i][j]=C[i][j]; } } result=0; for(int i=0;i<m;i++) { result+=B[i][i]; //нахождение следа полученной матрицы } cout << result << " "; } return 0; } |
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
import java.util.*; import java.lang.*; import java.io.*; class Ideone { public static void main (String[] args) { int m,n; Scanner sc = new Scanner(System.in); m = sc.nextInt(); n = sc.nextInt(); int[][] A = new int[m][m]; //массив для хранения исходной матрицы int[][] B = new int[m][m]; //массив для хранения степеней исходной матрицы int[][] C = new int[m][m]; //массив для хранения произведений A на B при возведении в степень for(int i=0;i<m;i++) { for(int j=0;j<m;j++) { A[i][j] = sc.nextInt(); B[i][j]=A[i][j]; } } int sum=0; int result=0; if(n>0) { for(int i=0;i<m;i++) { result+=B[i][i]; //нахождение следа исходной матрицы } System.out.printf("%d ",result); } for(int q=0;q<n-1;q++) { for(int i=0;i<m;i++) //перемножение матриц { for(int z=0;z<m;z++) { for(int j=0;j<m;j++) { sum+=A[i][j]*B[j][z]; } C[i][z]=sum; sum=0; } } for(int i=0;i<m;i++) //переприсваивание элементов матрицы { for(int j=0;j<m;j++) { B[i][j]=C[i][j]; } } result=0; for(int i=0;i<m;i++) { result+=B[i][i]; //нахождение следа полученной матрицы } System.out.printf("%d ",result); } } } |
Находим след исходной матрицы вне цикла. После, в цикле перемножаем матрицы и находим следы уже полученных матриц.