From 0bbf19a8433eaf8ff650d8d4e2ac036f5874c632 Mon Sep 17 00:00:00 2001 From: unlockable Date: Tue, 26 Dec 2023 14:18:48 +0800 Subject: [PATCH] 2 WA... --- .gitignore | 3 +- 2023208/main.cpp | 8 +-- 2023208/vandermonde.cpp | 124 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 130 insertions(+), 5 deletions(-) create mode 100644 2023208/vandermonde.cpp diff --git a/.gitignore b/.gitignore index 397b0c7..3f53dd8 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,5 @@ *.o *.dat *.ilk -*.pdb \ No newline at end of file +*.pdb +*.in \ No newline at end of file diff --git a/2023208/main.cpp b/2023208/main.cpp index 98df10a..250b893 100644 --- a/2023208/main.cpp +++ b/2023208/main.cpp @@ -44,7 +44,7 @@ int main() { for (int i = 0; i < n; i++) { scanf("%lf %lf", &read_x, &read_y); for (int j = 0; j < valid_point_num; j++) { - if (compare_double(read_x, point_xs[valid_point_num])) { + if (compare_double(read_x, point_xs[j])) { found_duplicate = true; break; } @@ -70,11 +70,11 @@ int main() { for (int i = 0; i < row; i++) { t[row] -= t[i] * get_num(row, i); } - if (!compare_double(t[row], 0)) { - t[row] /= get_num(row, row); + if (compare_double(t[row] / 1000, 0)) { + t[row] = 0; } else { - t[row] = 0; + t[row] /= get_num(row, row); } } diff --git a/2023208/vandermonde.cpp b/2023208/vandermonde.cpp new file mode 100644 index 0000000..d3f3744 --- /dev/null +++ b/2023208/vandermonde.cpp @@ -0,0 +1,124 @@ +#include +#define EPSILON 1e-6 +struct Point { + double x, y; +}; + +double A[101][101] = {0}; +Point points[101] = {0}; +int valid_point_num = 0; +int n = 0, m = 0; + +int display_matrix() { + for (int i = 0; i < valid_point_num; i++) { + for (int j = 0; j < valid_point_num; j++) { + printf("%lf ", A[i][j]); + } + printf("| %lf\n", points[i].y); + } + printf("\n"); + return 0; +} + +int display_result_vec() { + for (int i = 0; i < valid_point_num; i++) { + printf("%lf ", points[i].x); + } + + printf("\n"); + return 0; +} + +bool compare_double(double a, double b) { + return (a - b > 0 ? a - b : -(a - b)) < EPSILON; +} + +double evaluate(double x, int highest) { + double ans = points[highest].x; + for (int i = highest + 1; i < valid_point_num; i++) { + ans *= x; + ans += points[i].x; + } + return ans; +} + +int main() { + // freopen("lambdaeight19.in", "r", stdin); + scanf("%d %d", &n, &m); + for (int i = 0; i < n; i++) { + bool found_duplicate = false; + double read_x, read_y; + scanf("%lf %lf", &read_x, &read_y); + for (int j = 0; j < valid_point_num; j++) { + if (compare_double(read_x, points[j].x)) { + found_duplicate = true; + break; + } + } + + if (!found_duplicate) { + points[valid_point_num++] = Point {read_x, read_y}; + } + + } + + // vandermonde matrix + for (int i = 0; i < valid_point_num; i++) { + A[i][n - 1] = 1; + for (int j = valid_point_num - 2; j >= 0; j--) { + A[i][j] = points[i].x * A[i][j + 1]; + } + } + + // display_matrix(); + + // Gauss + for (int col = 0; col < valid_point_num; col++) { + for (int row = col + 1; row < valid_point_num; row++) { + if (compare_double(A[col][col], 0)) { + continue; + } + double coeff = - A[row][col] / A[col][col]; + A[row][col] = 0; + for (int i = col + 1; i < valid_point_num; i++) { + A[row][i] += coeff * A[col][i]; + } + points[row].y += coeff * points[col].y; + } + display_matrix(); + } + + // Solve for x + for (int i = valid_point_num - 1; i >= 0; i--) { + for (int j = valid_point_num - 1; j > i; j--) { + points[i].y -= points[j].x * A[i][j]; + } + if (compare_double(points[i].y, 0)) { + points[i].x = 0; + } else { + points[i].x = points[i].y / A[i][i]; + } + // display_result_vec(); + } + + display_result_vec(); + + // Find highest + int highest = 0; + for (int i = 0; i < valid_point_num; i++) { + if (!compare_double(points[i].x, 0)) { + highest = i; + break; + } + } + + printf("%d\n", valid_point_num - 1 - highest); + + //Evaluate + for (int i = 0; i < m; i++) { + double to_be_evaled = 0; + scanf("%lf", &to_be_evaled); + printf("%lf\n", evaluate(to_be_evaled, highest)); + } + return 0; +} \ No newline at end of file