suxxsfe

一言(ヒトコト)

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;
}
posted @ 2020-06-21 16:37  suxxsfe  阅读(121)  评论(0编辑  收藏  举报