洛谷 P1487 失落的成绩单

传送门:洛谷 P1487 失落的成绩单
题目描述:

数列 \(a\) 满足
\[A_i=\frac{A_{i-1}-A_{i+1}}{2}+d\]
给出:首项 \(A_1\)、末项 \(A_n\)\(d\)\(m\),求\(A_m\)

算法分析:
矩阵快速幂?还没学,所以我们就用数(mo)学(fa)来解决这道题。
预备知识:特征方程(不知道?这边请
首先来膜改一下式子:
\[A_i=\frac{A_{i-1}-A_{i+1}}{2}+d\]
\[2A_i=A_{i-1}-A_{i+1}+2d\]
\[A_{i+1}=-2A_{i}+A_{i-1}+2d\]
这是 \(A\) 的递推式,我们将 \(i\)\(1\)
\[A_{i}=-2A_{i-1}+A_{i-2}+2d\]
现在我们得出了答案 —— \(A_{i}=-2A_{i-1}+A_{i-2}+2d\)
那么我们先将 \(2d\) 放在一边,设数列 \(a\) 满足 \(a_{i}=-2a_{i-1}+a_{i-2}\)
设此数列公比为 \(q\),现在代入——
\[q^2a_{i-2}=-2qa_{i-2}+a_{i-2}\]
\[q^2+2q-1=0\]
这就是上述递推式的特征方程
现在解一下这个方程,可以得到—— \(q_1=-\sqrt{2}-1,q_2=\sqrt{2}-1\)
那么我们就可以得到这个数列的通项公式——
\[a_i=\alpha(-\sqrt{2}-1)^i+\beta(\sqrt{2}-1)^i\]
其中 \(i\leq n\),并且
\[\begin{cases} \alpha(-\sqrt{2}-1)+\beta(\sqrt{2}-1)=a_1\\ \alpha(-\sqrt{2}-1)^n+\beta(\sqrt{2}-1)^n=a_n\\ \end{cases} \]
将上面的方程解出来,我们可以得到——
\[\begin{cases} \alpha=\frac{a_1(\sqrt{2}-1)^{n-1}-a_n}{(-\sqrt{2}-1)(\sqrt{2}-1)^{n-1}-(-\sqrt{2}-1)^n}\\ \\ \beta=\frac{a_1(-\sqrt{2}-1)^{n-1}-a_n}{(\sqrt{2}-1)(-\sqrt{2}-1)^{n-1}-(\sqrt{2}-1)^n}\\ \end{cases} \]
代入通项公式并整理——
\[a_m=\frac{a_n[(\sqrt{2}-1)^{m-1}-(-1)^{m-1}(\sqrt{2}+1)^{m-1}]+(-1)^{m-1}a_1[(\sqrt{2}-1)^{n-m}-(-\sqrt{2}-1)^{n-m}]}{(\sqrt{2}-1)^{n-1}-(-1)^{n-1}(\sqrt{2}+1)^{n-1}}\]
\(f(x)=(\sqrt2-1)^x-(-1)^x(\sqrt2+1)^x\),可得
\[a_m=\frac{a_n\times f(m-1)+(-1)^{m-1}a_1\times f(n-m)}{f(n-1)}\]
好了,现在是最后一个问题——还有\(d\)呢!
其实很容(kun)易(nan),观察递推式—— \(A_i=-2A_{i-1}+A_{i-2}+2d\)
我们设 \(A_i=a_i+p\times d\),代入——
\[A_i=-2A_{i-1}+A_{i-2}+2d\]
\[a_i+pd=-2a_{i-1}-2pd+a_{i-2}+pd+2d\]
我们又有 \(a_{i}=-2a_{i-1}+a_{i-2}\),那么两边约去,可得——
\[pd=-2pd+pd+2d \Rightarrow p=1\]
\(A_i=a_i+d\)
那么,根据题意,我们来膜改一下式子——
\[A_m=\frac{(A_n-d)\times f(m-1)+(-1)^{m-1}(A_1-d)\times f(n-m)}{f(n-1)}+d\]
这样,我们就得到了数列的通项公式,代码就很好写了(没用龟(kuai)速幂,数据太弱QwQ)


#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const double p=sqrt(2)-1;
int n,m; double d,a1,an;
double c(int op) {return (op&1)?-1:1;}
double f(int x) {return pow(p,x)-c(x)*pow(p+2,x);}
int main()
{
    scanf("%d%d%lf%lf%lf",&n,&m,&d,&a1,&an);
    if(m==0) printf("0.000");
    else printf("%.3lf",((an-d)*f(m-1)+c(m-1)*(a1-d)*f(n-m))/f(n-1)+d);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/ezsyshx/p/10449623.html