P1487 失落的成绩单

https://www.luogu.com.cn/problem/P1487

一个长度为 (n) 的序列,已知 (A_1,A_n,n,d),并满足 (A_i=dfrac{A_{i-1}+A_{i+1}}{2}+d),求 (A_m)

最近数学课学了点特征方程,所以用它做了下这题

一般用特征方程求通项的时候,是已知数列满足 (a_{i+1}+Ba_i+Ca_{i-1}=0)
那么设 (a_{n+1}-pa_n=q(a_n-pa_{n-1})),转化成 (a_{n+1}-(p+q)a_n+pqa_{n-1}=0)
此时应满足 (p+q=-B,pq=C)
然后用韦达定理构造一个两个解分别是 (p,q) 的二次方程并把它解出来,就知道 (p,q)
如果无解当然就是不能这样构造

进而设 (b_n=a_{n+1}-pa_n),则:

[b_n=qb_{n-1}Rightarrow b_n=a_{n+1}-pa_n=b_1q^{n-1}=(a_2-pa_1)q^{n-1} ]

同时除以 (p^{n+1}),就是:

[dfrac{a_{n+1}}{p^{n+1}}-dfrac{a_n}{p^n}=dfrac{(a_2-pa_1)q^{n-1}}{p^{n+1}} ]

再设 (c_n=dfrac{a_n}{p^n})
就可以表示成:

[c_{n+1}-c_n=dfrac{(a_2-pa_1)q^{n-1}}{p^{n+1}} ]

那么对 (c) 做一个累加,中间的一堆项就消没了,得到:

[c_n-c_1=sum_{i=1}^{n-1}dfrac{(a_2-pa_1)q^{i-1}}{p^{i+1}} ]

一通整理,发现从里面把与求和无关的因式提出来,就是个等比数列,用一下求和公式,于是:

[c_n=dfrac{a_2-pa_1}{p^2}cdot dfrac{1-(frac{q}{p})^{n-1}}{1-frac{q}{p}}+dfrac{a_1}{p} ]

还原成 (a_n),就是:

[a_n=dfrac{p^{n-2}(a_2-pa_1)(1-(frac{q}{p})^{n-1})}{1-frac{q}{p}}+a_1p^{n-1} ]

[a_n=dfrac{(frac{q^{n-1}}{p}-p^{n-2})(a_2-pa_1)}{frac{q}{p}-1}+a_1p^{n-1} ]

也许能再化简让形式更好看一些?但我懒得化了


再看这个题

[A_{i+1}+2A_i-A_{i-1}=2d ]

发现这个 (2d) 很耽误事,但是可以设 (a_i=A_i+d),于是:

[a_{i+1}+2a_i-a_{i-1}=0 ]

按照之前讲的,此时应满足 (p+q=-2,pq=-1),于是构造方程 (x^2+2x-1=0)
两个解对应 (p,q),也就是 (p=sqrt{2}-1,q=-sqrt{2}-1),当然把它们的值互换也不会对结果产生影响
但我们并不知道 (a_n) 表达式里的 (a_2) 是什么,但是知道 (a_n),于是可以变一下那个式子把 (a_2) 求出来:

[a_2=frac{(frac{q}{p}-1)(a_n-a_1p^{n-1})}{frac{q^{n-1}}{p}-p^{n-2}}+a_1p ]

然后就可以带入 (n=m) 来求出答案了

注意判断一下 (m=0) 这种奇怪的情况

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<map>
#include<iomanip>
#include<cstring>
#define reg register
#define EN std::puts("")
#define LL long long
inline long double power(long double a,int b){
	long double ret=1;
	while(b--) ret*=a;
	return ret;
}
int main(){
	int n,m;scanf("%d%d",&n,&m);
	if(!m) return puts("0.000"),0;
	long double d,A1,An,a1,an,a2,am,Am;scanf("%Lf%Lf%Lf",&d,&A1,&An);
	a1=A1-d;an=An-d;
	long double p=std::sqrt(2)-1,q=-std::sqrt(2)-1;
	a2=(q/p-1)*(an-a1*power(p,n-1))/(power(q,n-1)/p-power(p,n-2))+p*a1;
	am=(power(q,m-1)/p-power(p,m-2))*(a2-p*a1)/(q/p-1)+a1*power(p,m-1);
	Am=am+d;
	printf("%.3Lf",Am);
	return 0;
}
原文地址:https://www.cnblogs.com/suxxsfe/p/13172938.html