• 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;
    }
    
  • 相关阅读:
    还能这样偷懒?用Python实现网站自动签到脚本
    普通爬虫 VS 多线程爬虫!Python爬虫运行时间对比
    中文文献阅读方法及笔记模板
    约束
    可迭代对象补充
    练习题及补充
    内置函数的补充/super/异常值处理
    特殊成员
    嵌套
    面向对象知识点总结补充
  • 原文地址:https://www.cnblogs.com/suxxsfe/p/13172938.html
Copyright © 2020-2023  润新知