diff --git a/2023208/main.cpp b/2023208/main.cpp index 250b893..fa9659c 100644 --- a/2023208/main.cpp +++ b/2023208/main.cpp @@ -4,7 +4,7 @@ double A[5051] = {0}; double point_xs[101] = {0}; -long double t[101] = {0}; +int valid_point_num = 0; double get_num(int row, int col) { if (col > row) { @@ -25,23 +25,31 @@ bool compare_double(long double a, long double b) { } double evaluate(double x, int highest) { - double ans = t[highest]; + double ans = get_num(highest, highest); for (int j = highest - 1; j >= 0; j--) { ans *= x - point_xs[j]; - ans += t[j]; + ans += get_num(j, j); } return ans; } +int display_mat() { + for (int i = 0; i < valid_point_num; i++) { + for (int j = 0; j < valid_point_num; j++) { + printf("%lf ", get_num(i, j)); + } + printf("\n"); + } + printf("\n"); + return 0; +} + int main() { - int n = 0, m = 0; - int valid_point_num = 0; - // freopen("lambdaeight9.in", "r", stdin); - scanf("%d", &n); - scanf("%d", &m); - double read_x, read_y; - bool found_duplicate = false; + int n, m; + 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, point_xs[j])) { @@ -52,47 +60,41 @@ int main() { if (!found_duplicate) { point_xs[valid_point_num] = read_x; - t[valid_point_num] = read_y; + set_num(valid_point_num, 0, read_y); valid_point_num++; } } - // Prepare the matrix - for (int row = 0; row < valid_point_num; row++) { - set_num(row, 0, 1); - for (int col = 1; col <= row; col++) { - set_num(row, col, get_num(row, col - 1) * (point_xs[row] - point_xs[col - 1])); + // Go create the full table + for (int col = 1; col < valid_point_num; col++) { + int delta = col; + for (int row = col; row < valid_point_num; row++) { + set_num(row, col, (get_num(row, col - 1) - get_num(row - 1, col - 1)) / (point_xs[row] - point_xs[row - delta])); } + if (compare_double(get_num(col, col) / 1000, 0)) { + set_num(col, col, 0); + } + // display_mat(); } - // Solve for t - for (int row = 0; row < valid_point_num; row++) { - for (int i = 0; i < row; i++) { - t[row] -= t[i] * get_num(row, i); - } - if (compare_double(t[row] / 1000, 0)) { - t[row] = 0; - } - else { - t[row] /= get_num(row, row); - } - } - // Find for highest exponent + // Find the highest int highest = valid_point_num - 1; for (; highest >= 0; highest--) { - if (!compare_double(t[highest], 0)) { - break; + if (compare_double(get_num(highest, highest) / 1000, 0)) { + continue; } + break; } printf("%d\n", highest); - // Evaluate + double to_be_evaled = 0; 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