zoukankan      html  css  js  c++  java
  • 洛谷P4451 [国家集训队]整数的lqp拆分(生成函数)

    题面

    传送门

    题解

    我对生成函数一无所知

    我们设(F(x))为斐波那契数列的生成函数,(G(x))为答案的生成函数,那么容易得到递推关系

    [g_n=sum_{i=0}^{n-1}f_ig_{n-i}+f_n ]

    其中(g_0=0,g_1=1)

    那么写成生成函数的形式就是

    [G=FG+F ]

    [G={Fover 1-F} ]

    我们考虑一下(F),因为

    [F(x)=sum_{i=1}^infty f_ix^i ]

    [xF(x)=sum_{i=2}^infty f_{i-1}x^i ]

    上面的柿子减去下面的柿子

    [(1-x)F(x)=x+sum_{i=2}^infty f_{i-2}x^i ]

    [(1-x)F(x)=x+x^2F(x) ]

    解得

    [F(x)={xover 1-x-x^2} ]

    代入可解出

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

    我们把(1-2x-x^2)因式分解一下

    [G(x)={xover left(1-(1+sqrt{2})x ight)left(1-(1-sqrt{2})x ight)} ]

    然后裂项

    [G(x)={1over 2sqrt{2}}{1over left(1-(1+sqrt{2})x ight)}-{1over 2sqrt{2}}{1over left(1-(1-sqrt{2})x ight)} ]

    那么现在就变成两个等比数列求和的形式了,可以直接求出(g_n)的通项公式

    [g_n={(1+sqrt{2})^n-(1-sqrt{2})^nover 2sqrt{2}} ]

    听说大佬们用生成函数只要五行就能写完题解……然而我并看不懂它们在写什么……

    //minamoto
    #include<bits/stdc++.h>
    #define R register
    #define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
    #define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
    #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
    using namespace std;
    const int P=1e9+7,s=59713600;
    inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
    inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
    inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
    int ksm(R int x,R int y){
    	R int res=1;
    	for(;y;y>>=1,x=mul(x,x))if(y&1)res=mul(res,x);
    	return res;
    }
    int main(){
    //	freopen("testdata.in","r",stdin);
    	int n;scanf("%d",&n);
    	printf("%d
    ",mul(dec(ksm(s+1,n),ksm(P+1-s,n)),ksm(mul(s,2),P-2)));
    	return 0;
    }
    
  • 相关阅读:
    插入排序法
    二分查找
    排序算法
    牛客网 猜数游戏
    决策树及随机森林(笔记)
    knn的缺陷及改进
    区块链、比特币简易PYTHON实现版笔记
    B树,B+树,以及它们和数据库索引之间的关系
    Balanced Binary Tree
    Advantages & Disadvantages of Recursion
  • 原文地址:https://www.cnblogs.com/bztMinamoto/p/10557621.html
Copyright © 2011-2022 走看看