zoukankan      html  css  js  c++  java
  • [国家集训队]整数的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);
    }
    
  • 相关阅读:
    Pytest 系列(28)- 参数化 parametrize + @allure.title() 动态生成标题
    Pytest 系列(27)- allure 命令行参数
    Pytest 系列(26)- 清空 allure 历史报告记录
    Pytest 系列(25)- 标记用例级别 @allure.
    Pytest 系列(24)- allure 环境准备
    基于Python的三种Bandit算法的实现
    博客迁移
    团体程序设计天梯赛2020游记
    P1825 [USACO11OPEN]Corn Maze S
    # JavaScript中的对象转数组Array.prototype.slice.call()方法详解
  • 原文地址:https://www.cnblogs.com/asuldb/p/10534860.html
Copyright © 2011-2022 走看看