#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; }