失落的成绩单题解

· · 题解

这题挺简单的,一些数学推导就可以做出。

首先,我们设 x=A_1,y=A_n

A_2=\dfrac{x-A_3}{2}+d=\dfrac{x-A_3+2d}{2} A_3=\dfrac{A_2-A_4}{2}+d=\dfrac{\dfrac{x-A_3+2d}{2}-A_4}{2} 4A_3=x-A_3+2d-2A_4+4d A_3=\dfrac{x-2A_4+6d}{5} A_4=\dfrac{A_3-A_5}{2}+d=\dfrac{\dfrac{x-2A_4+6d}{5}-A_5}{2}+d 10A_4=x-2A_4+6d-5A_5+10d A_4=\dfrac{x-5A_5+16d}{12}

注:写得较为繁琐是便于下面的系数推式子。

发现了什么?这些式子都是形如 A_i=\dfrac{x-aA_{i+1}+bd}{c} 的,而前面的系数 (a,b,c) 都是和前面的系数有关,为了方便表述,这里等式左边代表当前系数,右边代表上一个的系数:

a=c b=b+2c c=2c+a

接下来就很简单喽!AC 代码如下:

#include<bits/stdc++.h>
using namespace std;
long long n,m,a[100],b[100],c[100];
double d,x,y,ans[100];
int main(){
    scanf("%lld%lld%lf%lf%lf",&n,&m,&d,&x,&y);
    if(m==1) printf("%.3lf",x);
    else if(m==n) printf("%.3lf",y);
    else{
        a[2]=1;
        b[2]=2;
        c[2]=2;
        for(int i=3;i<n;i++){
            a[i]=c[i-1];
            b[i]=b[i-1]+2*c[i-1];
            c[i]=2*c[i-1]+a[i-1];
        }
        ans[n]=y;
        for(int i=n-1;i>=1;i--) ans[i]=(x-a[i]*ans[i+1]+b[i]*d)/c[i];
        printf("%.3lf",ans[m]);
    }
    return 0;
}