結果
| 問題 |
No.2447 行列累乗根
|
| コンテスト | |
| ユーザー |
SSRS
|
| 提出日時 | 2023-08-25 22:34:21 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,058 bytes |
| コンパイル時間 | 2,648 ms |
| コンパイル使用メモリ | 204,408 KB |
| 最終ジャッジ日時 | 2025-02-16 14:11:08 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 13 WA * 15 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
const double eps = 0.00000000001;
int main(){
cout << fixed << setprecision(5);
int T;
cin >> T;
for (int i = 0; i < T; i++){
vector<vector<double>> M(2, vector<double>(2));
for (int j = 0; j < 2; j++){
for (int k = 0; k < 2; k++){
cin >> M[j][k];
}
}
if (M[0][1] == 0 && M[1][0] == 0){
cout << cbrt(M[0][0]) << ' ' << "0.00000" << endl;
cout << "0.00000" << ' ' << cbrt(M[1][1]) << endl;
} else {
double tr = M[0][0] + M[1][1];
double det = M[0][0] * M[1][1] - M[0][1] * M[1][0];
vector<double> eigen = {(tr + sqrt(tr * tr - 4 * det)) / 2, (tr - sqrt(tr * tr - 4 * det)) / 2};
vector<vector<double>> D(2, vector<double>(2, 0));
for (int j = 0; j < 2; j++){
D[j][j] = eigen[j];
}
vector<vector<double>> P(2, vector<double>(2));
for (int j = 0; j < 2; j++){
vector<vector<double>> M2 = M;
for (int k = 0; k < 2; k++){
M2[k][k] -= eigen[j];
}
int p = 0;
if (abs(M2[0][0]) + abs(M2[0][1]) < abs(M2[1][0]) + abs(M2[1][1])){
p = 1;
}
P[j][0] = M2[p][1];
P[j][1] = -M2[p][0];
}
double det2 = P[0][0] * P[1][1] - P[1][0] * P[0][1];
vector<vector<double>> Pinv = P;
swap(Pinv[0][0], Pinv[1][1]);
Pinv[0][1] *= -1;
Pinv[1][0] *= -1;
for (int j = 0; j < 2; j++){
for (int k = 0; k < 2; k++){
Pinv[j][k] /= det2;
}
}
vector<vector<double>> ans(2, vector<double>(2, 0));
for (int j = 0; j < 2; j++){
for (int k = 0; k < 2; k++){
for (int l = 0; l < 2; l++){
for (int m = 0; m < 2; m++){
ans[j][m] += P[j][k] * cbrt(D[k][l]) * Pinv[l][m];
}
}
}
}
for (int j = 0; j < 2; j++){
for (int k = 0; k < 2; k++){
cout << ans[j][k];
if (k < 1){
cout << ' ';
}
}
cout << endl;
}
}
}
}
SSRS