• [国家集训队]整数的lqp拆分


    题目

    设我们要求的是(g_n)

    我们强行定义(g_0=1)

    于是就有

    [g_i=sum_{j=0}^{i-1}fib_{j}g_{i-j} ]

    就是新枚举一个(j),通过一个分配率和在原来的答案上更进一步

    于是这个数列的生成函数就是

    [egin{aligned} G(x)=&sum_{i=0}(sum_{j=0}^{i-1}fib_jg_{i-j}+[i=0])x^i\&=1+sum_{i=0}(sum_{j=0}^{i-1}fib_jg_{i-j})x^i\&=1+sum_{i=0}sum_{j=0}^{i-1}fib_{j}x_j imes g_{i-j}x^{i-j}end{aligned} ]

    发现里面是(fib)的生成函数卷上(G(x))

    [F(x)=sum_{i=0}fib_ix^i=frac{x}{1-x-x^2} ]

    于是就有

    [G(x)=1+G(x)F(x) ]

    解得

    [G(x)=frac{1-x-x^2}{1-2x-x^2}=frac{1-2x-x^2+x}{1-2x-x^2}=1+frac{x}{1-2x-x^2} ]

    发现多出来的那个常数项是我们强行使得(g_0=1)的结果,不管它就好了

    强行处理后面的(frac{x}{1-2x-x^2})

    我们发现分母上可以被因式分解一下

    [frac{x}{1-2x-x^2}=frac{x}{(1-(1-sqrt{2})x)(1-(1+sqrt{2})x)} ]

    你说怎么搞这个因式分解,你把(1-sqrt{2})设成(frac{apmsqrt{b}}{c})的形式

    就会发现

    [frac{a+sqrt{b}}{c} imes frac{a-sqrt{b}}{c}=frac{a^b-b}{c^2}=-1 ]

    [-(frac{a+sqrt{b}}{c}+ frac{a-sqrt{b}}{c})=-2 ]

    根据下面那个式子我们可以发现(a=c)

    于是上面那个式子就是(2a^2-b=0),我们发现只需要使得(a=1,b=2)就可以了

    于是我们就又需要来拆掉这个式子

    至于这个如何去拆,我们可以继续列方程

    设上面那个式子等于

    [egin{aligned}&frac{a}{1-(1-sqrt{2})x}+frac{b}{1-(1+sqrt{2})x}\&=frac{a(1-(1+sqrt{2})x)+b(1-(1-sqrt{2})x)}{(1-(1-sqrt{2})x)(1-(1+sqrt{2})x)}\&=frac{a-ax-asqrt{2}x+b-bx+bsqrt{2}x}{(1-(1-sqrt{2})x)(1-(1+sqrt{2})x)}end{aligned} ]

    我们知道上面那一大坨东西应该等于(x)

    于是

    [a-ax-asqrt{2}x+b-bx+bsqrt{2}x=x ]

    由于没有常数项,于是(a=-b)

    也就有

    [-asqrt{2}x+bsqrt{2}x=x ]

    解得(a=-frac{1}{2sqrt{2}},b=frac{1}{2sqrt{2}}),我们(a,b)放到外面就好了

    可以拆成

    [-frac{sqrt{2}}{4} imesfrac{1}{1-(1-sqrt{2})x}+frac{sqrt{2}}{4} imes frac{1}{1-(1+sqrt{2})x} ]

    发现有两个诸如(frac{1}{1-cx})的生成函数,这就是一个公比为(c)的等比数列

    于是我们就可以推出通项

    [g_n=-frac{sqrt{2}}{4} imes (1-sqrt{2})^n+frac{sqrt{2}}{4} imes(1+sqrt{2})^n ]

    由于我比较菜,不会二次剩余,可以写个暴力求一下(x^2 equiv 2(mod 1e9+7)),发现(x=59713600)

    根据通项就可以求了,就是一个快速幂的事

    #include<cstdio>
    #define LL long long
    const LL mod=1e9+7;
    const LL Sqr=59713600;
    const LL Inv=250000002;
    LL n;
    inline LL ksm(LL a,LL b) {LL S=1;while(b) {if(b&1) S=S*a%mod;b>>=1;a=a*a%mod;}return S;}
    int main() {
    	scanf("%lld",&n);
    	printf("%lld
    ",((ksm(1+Sqr,n)*Sqr%mod*Inv%mod-ksm(1-Sqr+mod,n)*Sqr%mod*Inv)%mod+mod)%mod);
    }
    
  • 相关阅读:
    面试题准备
    ImageList控件
    修改Visual Studio 2010 帮助文件库的位置
    委托与事件(续)
    PictureBox
    我的廣播情緣12/26
    回首我的2007 12/25
    水晶報表:列印支票金額12/12
    聖誕節快樂
    新年快樂
  • 原文地址:https://www.cnblogs.com/asuldb/p/10534860.html
Copyright © 2020-2023  润新知