Files
DataStructureAndAlgorithm/2023208/main.cpp
unlockable f24638bb8c 3 wa ??
2023-12-26 00:21:42 +08:00

101 lines
2.4 KiB
C++

#include <stdio.h>
#define EPSILON 1e-6
double A[5051] = {0};
double point_xs[101] = {0};
double t[101] = {0};
double get_num(int row, int col) {
if (col > row) {
return 0;
}
return A[row * (row + 1) / 2 + col];
}
double set_num(int row, int col, double content) {
if (col > row) {
return 0;
}
return A[row * (row + 1) / 2 + col] = content;
}
bool compare_double(double a, double b) {
return (a - b > 0 ? a - b : -(a - b)) < EPSILON;
}
double evaluate(double x, int highest) {
double ans = t[highest];
for (int j = highest - 1; j >= 0; j--) {
ans *= x - point_xs[j];
ans += t[j];
}
return ans;
}
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;
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])) {
found_duplicate = true;
break;
}
}
if (!found_duplicate) {
point_xs[valid_point_num] = read_x;
t[valid_point_num] = 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, point_xs[row] - point_xs[col - 1]);
}
}
// Solve for t
int continued_zero_count = 0;
for (int row = 0; row < valid_point_num; row++) {
for (int i = 0; i < row; i++) {
t[row] /= get_num(row, i);
t[row] -= t[i];
}
if (compare_double(t[row], 0)) {
t[row] = 0;
continued_zero_count++;
}
else {
t[row] /= get_num(row, row);
continued_zero_count = 0;
}
}
// Find for highest exponent
int highest = valid_point_num - 1;
for (; highest >= 0; highest--) {
if (!compare_double(t[highest] / 10, 0)) {
break;
}
}
printf("%d\n", 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;
}