由a[i] = (a[i-1] - a[i+1]) / 2 + d,得2a[i] - 2d = a[i-1] - a[i+1]。
移项后 a[i+1] = a[i-1] - 2a[i] + 2d。
a[2] = (a[n] - x * a[1] - z * d) / y
移项后 a[i+1] = a[i-1] - 2a[i] + 2d。
令i = i-1,得a[i] = a[i-2] - 2a[i-1] + 2d。
已知:a[1]、a[n]。a[3] = a[1] - 2a[2] + 2d ,a[4] = a[2] - 2a[3] + 2d得:a[4] = a[2] - 2(a[1] - 2a[2] + 2d) + 2d
可以根据上式递推求a[n] = x * a[1] + y * a[2] + z * d 中的x,y,z。 a[2] = (a[n] - x * a[1] - z * d) / y
#include<stdio.h>
struct ak
{
int x, y, z;
}s[100];
int main()
{
double a[1000], d;
int n, m;
scanf("%d %d", &n, &m);
scanf("%lf %lf %lf", &d, &a[1], &a[n]);
s[3].x = 1, s[3].y = -2, s[3].z = 2;
s[4].x = -2, s[4].y = 5, s[4].z = -2;
for(int i = 5; i <= n; i++)
{
s[i].x = s[i-2].x - 2 * s[i-1].x;
s[i].y = s[i-2].y - 2 * s[i-1].y;
s[i].z = s[i-2].z - 2 * s[i-1].z + 2;
}
a[2] = (a[n] - s[n].x * a[1] - s[n].z * d) / s[n].y;
for(int i = 3; i <= m; i++)
{
a[i] = a[i-2] - 2 * a[i-1] + 2 * d;
}
printf("%.3f",a[m]);
return 0;
}