1 条题解

  • 0
    @ 2025-8-24 21:25:39

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 常青藤
    **

    搬运于2025-08-24 21:25:38,当前版本为作者最后更新于2019-02-28 12:49:54,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    前言:安利一发自己的博客(LaTeX挂了这边走)(正在迁移)

    UPD:发现LaTeXLaTeX有部分不能正常显示,在洛谷博客里还好好的,试着调了一下,并删除了一些可有可无的话,求通过

    题目描述:

    数列 aa 满足

    Ai=Ai1Ai+12+dA_i=\frac{A_{i-1}-A_{i+1}}{2}+d

    给出:首项 A1A_1、末项 AnA_nddmm,求AmA_m

    算法分析:

    矩阵快速幂?还没学,所以我们就用数(mo)学(fa)来解决这道题。

    预备知识:特征方程


    我们以这个式子为例—— fi=fi1+6fi2f_i=f_{i-1}+6f_{i-2}

    首先我们来看两个数集

    $A=\{x\mid x=(-2)^k,k\in\mathbb{N^*}\}\ ,\ B=\{x\mid x=3^k,k\in\mathbb{N^*}\}$

    那么,我们可以列出 AA 的前几项:2,4,8,16,...-2,4,-8,16,...BB 的前几项:3,9,27,81,...3,9,27,81,...

    AA 代入递推式,神奇的发现——

    f1=2f_1=-2

    f2=4f_2=4

    f3=4+6×(2)=8f_3=4+6\times(-2)=-8

    f4=8+6×4=16f_4=-8+6\times4=16

    ............

    AA 中的数都满足上述的递推式,同样的,BB 也满足。

    很明显,fi=(2)kf_i=(-2)^kfi=3kf_i=3^k 都是上述递推式的通项公式

    下面我们来看两个引理——

    1、若 fi=aif_i=a^i 是某一递推式的通项公式,那么,fi=λaif_i=\lambda a^i 同样满足递推式(两边同乘上系数即可)

    2、若 fi=aif_i=a^ifi=bif_i=b^i 都满足递推式,那么,fi=α×ai+β×bif_i=\alpha\times a^i+\beta\times b^i 同样满足(两式乘上系数相加即可)

    接下来,我们来看一个经典的例子——斐波拉契数列 fi=fi1+fi2f_i=f_{i-1}+f_{i-2}

    现在我们不能像刚才那个式子“观察”出一个通解了,那么就需要我们自己进行构造

    现在我们设存在一组等比数列满足这个递推式,其公比为 qq ,那么我们看一下这个式子——

    fi=fi1+fi2f_i=f_{i-1}+f_{i-2} q2×fi2=q×fi2+fi2q^2\times f_{i-2}=q\times f_{i-2}+f_{i-2} q2=q+1q^2=q+1 q2q1=0q^2-q-1=0

    这就是斐波拉契数列的特征方程

    (当然,这个是比较容易理解的解释,详细说明: 特征方程)

    把它解出来,可以得到—— q1=5+12,q2=5+12q_1=\frac{\sqrt5+1}{2},q_2=\frac{-\sqrt5+1}{2}

    那么,我们就知道了——公比为±5+12\frac{\pm\sqrt5+1}{2}的等比数列满足斐波拉契数列

    那么,我们又知道了数列的前两项:f1=f2=1f_1=f_2=1

    我们设 $f_i=\alpha\times(\frac{\sqrt5+1}{2})^i+\beta\times(\frac{-\sqrt5+1}{2})^i$,代入f1,f2f_1,f_2

    则——

    $$\begin{cases} \alpha(\frac{\sqrt5+1}{2})+\beta(\frac{-\sqrt5+1}{2})=f_1=1\\\\ \alpha(\frac{\sqrt5+1}{2})^2+\beta(\frac{-\sqrt5+1}{2})^2=f_2=1\\ \end{cases} $$

    α=55,β=55\alpha=\frac{\sqrt5}{5},\beta=-\frac{\sqrt5}{5},这样,我们就求出了通项公式

    回到之前的递推数列——fi=fi1+6fi2f_i=f_{i-1}+6f_{i-2},怎么得出其通解的?

    其实很简单。我们设等比数列公比为 qq,就可以得到特征方程—— q2q6=0q1=2,q2=3q^2-q-6=0 \Rightarrow q_1=-2,q_2=3


    进入正题,首先来膜改一下式子:

    Ai=Ai1Ai+12+dA_i=\frac{A_{i-1}-A_{i+1}}{2}+d 2Ai=Ai1Ai+1+2d2A_i=A_{i-1}-A_{i+1}+2d Ai+1=2Ai+Ai1+2dA_{i+1}=-2A_{i}+A_{i-1}+2d

    这是 AA 的递推式,我们将 ii11

    Ai=2Ai1+Ai2+2dA_{i}=-2A_{i-1}+A_{i-2}+2d

    现在我们得出了答案 —— Ai=2Ai1+Ai2+2dA_{i}=-2A_{i-1}+A_{i-2}+2d

    那么我们先将 2d2d 放在一边,设数列 aa 满足 ai=2ai1+ai2a_{i}=-2a_{i-1}+a_{i-2} 设此数列公比为 qq,现在代入——

    q2ai2=2qai2+ai2q^2a_{i-2}=-2qa_{i-2}+a_{i-2} q2+2q1=0q^2+2q-1=0

    这就是上述递推式的特征方程 现在解一下这个方程,可以得到—— q1=21,q2=21q_1=-\sqrt{2}-1,q_2=\sqrt{2}-1

    那么我们就可以得到这个数列的通项公式——

    ai=α(21)i+β(21)ia_i=\alpha(-\sqrt{2}-1)^i+\beta(\sqrt{2}-1)^i

    其中 ini\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)=(21)x(1)x(2+1)xf(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)} $$

    好了,现在是最后一个问题——还有dd呢!

    观察递推式—— Ai=2Ai1+Ai2+2dA_i=-2A_{i-1}+A_{i-2}+2d

    我们设 Ai=ai+p×dA_i=a_i+p\times d,代入——

    Ai=2Ai1+Ai2+2dA_i=-2A_{i-1}+A_{i-2}+2d ai+pd=2ai12pd+ai2+pd+2da_i+pd=-2a_{i-1}-2pd+a_{i-2}+pd+2d

    我们又有 ai=2ai1+ai2a_{i}=-2a_{i-1}+a_{i-2},那么两边约去,可得——

    pd=2pd+pd+2dp=1pd=-2pd+pd+2d \Rightarrow p=1

    Ai=ai+dA_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<bits/stdc++.h>
    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;
    }
    

    完结撒花QwQ

    • 1

    信息

    ID
    480
    时间
    1000ms
    内存
    512MiB
    难度
    5
    标签
    递交数
    0
    已通过
    0
    上传者