This commit is contained in:
unlockable
2023-12-26 14:59:28 +08:00
parent 4dcd689fb2
commit c891f998b7

View File

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