CodeChef JADUGAR2 Chef and Same Old Recurrence 2

vjudge

下面构造生成函数\(F(x)=\sum_{i=0}^{\infty} dp(i)x^i\)

根据递推式,可以列出\(F(x)=AxF(x)+BF^2(x)+kx\),然后移项化简后可得\(F(x)=\frac{1-Ax\pm\sqrt{(1-Ax)^2-4kBx}}{2B}\).由于没有\(dp(0)\),所以\(F(x)\)没有常数项,那么有用的根只有\(F(x)=\frac{1-Ax-\sqrt{(1-Ax)^2-4kBx}}{2B}\)

发现生成函数里只有那个根号是要考虑的,所以考虑求出\(\sqrt{(1-Ax)^2-4kBx}=\sqrt{A^2x^2-(2A+4kB)x+1}\).先令\(a=A^2,b=-(2A+4kB),c=1\),写成\(G(x)=\sqrt{ax^2+bx+c}\),然后设\(H(x)=ax^2+bx+c\),则有\(G(x)=H^{\frac{1}{2}}(x)\),然后对两边求导,得

\(G'(x)=\frac{1}{2}H^{-\frac{1}{2}}(x)H'(x)\)

\(G'(x)H(x)=\frac{1}{2}H^{\frac{1}{2}}(x)H'(x)\)

\(G'(x)H(x)=\frac{1}{2}G(x)H'(x)\)

又因为有\(G(x)=\sum_{i=0}^{\infty}g_ix^i,G'(x)=\sum_{i=0}^{\infty}g_{i+1}(i+1)x^i\),对比\(G'(x)H(x)=\frac{1}{2}G(x)H'(x)\)两边系数后可得\(g_{i+1}=\frac{b(\frac{1}{2}-i)g_i+a(2-i)g_{i-1}}{c(i+1)}\),带入\(a,b,c\)后得\(g_i=\frac{-(2A+4kB)(\frac{3}{2}-i)g_{i-1}+A^2(3-i)g_{i-2}}{i}\),然后可以得到\(G(x)\),进而得到\(F(x)\),最后预处理\(\sum_{i=1}^{n} dp(i)^2\)就可以单次\(O(1)\)求出答案

\(\tiny\text{这方法去年就有洛谷日报了,一年了还不会/kk}\)

#include<bits/stdc++.h>
#define LL long long

using namespace std;
const int N=1e7+10,mod=1e9+7;
int rd()
{
    int x=0,w=1;char ch=0;
    while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+(ch^48);ch=getchar();}
    return x*w;
}
int fpow(int a,int b){int an=1;while(b){if(b&1) an=1ll*an*a%mod;a=1ll*a*a%mod,b>>=1;}return an;}
int ginv(int a){return fpow(a,mod-2);}
int n,k,a,b,inv[N],f[N];

int main()
{
//////////////
    inv[0]=inv[1]=1;
    for(int i=2;i<=N-5;++i) inv[i]=(mod-1ll*mod/i*inv[mod%i]%mod)%mod;
    n=rd(),k=rd(),a=rd(),b=rd();
    f[0]=1,f[1]=(1ll*mod+mod-a-2ll*k*b%mod)%mod;
    int yyb=2ll*f[1]%mod,inv2=ginv(2),i2t3=3ll*inv2%mod;
    for(int i=2;i<=n;++i) f[i]=1ll*(1ll*yyb*(i2t3-i+mod)%mod*f[i-1]+1ll*a*a%mod*(3-i+mod)%mod*f[i-2])%mod*inv[i]%mod;
    f[0]-=1,f[1]=(f[1]+a)%mod;
    int invb=ginv((b+b)%mod);
    for(int i=0;i<=n;++i) f[i]=1ll*(mod-f[i])*invb%mod;
    for(int i=1;i<=n;++i) f[i]=(1ll*f[i]*f[i]+f[i-1])%mod;
    int q=rd();
    while(q--)
    {
        int l=rd(),r=rd();
        printf("%d\n",(f[r]-f[l-1]+mod)%mod);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/smyjr/p/12264611.html

时间: 2024-10-21 02:17:26

CodeChef JADUGAR2 Chef and Same Old Recurrence 2的相关文章

[Codechef CHSTR] Chef and String - 后缀数组

[Codechef CHSTR] Chef and String Description 每次询问 \(S\) 的子串中,选出 \(k\) 个相同子串的方案有多少种. Solution 本题要求不是很高,\(O(n^2)\) 统计每个出现次数子串个数即可. 我因为一个lld WA了一晚上(猛然意识到要%d读入long long的时候,之前一直没有翻车的原因是开了全局,如果是局部又不初始化就瞬间gg了,然鹅这个错误本地查不出来) #include <bits/stdc++.h> using na

@codechef - [email&#160;protected] Chef and Same Old Recurrence 2

目录 @[email protected] @[email protected] @accepted [email protected] @[email protected] @[email protected] 定义 dp 序列: \[dp(1) = K\dp(n) = A\times dp(n-1) + B\times \sum_{i=1}^{n-1}dp(i)\times dp(n-i)\] Q 次询问,每次询问给出 L, R,求 \(\sum_{i=L}^{R}dp(i)^2\),对 1

[CodeChef - GERALD07 ] Chef and Graph Queries

Read problems statements in Mandarin Chineseand Russian. Problem Statement Chef has a undirected graph G. This graph consists of N vertices and M edges. Each vertex of the graph has an unique index from 1 to N, also each edge of the graph has an uniq

【CodeChef】Chef and Graph Queries

Portal --> CC Chef and Graph Queries Solution 快乐数据结构题(然而好像有十分优秀的莫队+可撤销并查集搞法qwq) 首先考虑一种方式来方便一点地..计算一个图的联通块数量:我们可以考虑容斥,维护每个连通块的生成树,然后\(n-\)生成树边数就是答案了 这样有一个好,加边的时候比较好处理,但是光这样并不能解决我们的问题 ? 顺着这个思路思考,先不考虑时间复杂度,对于一个询问,考虑将编号为\(l\sim r\)的边一条一条加入第\(1\sim l-1\)条

[bzoj3514][CodeChef GERALD07] Chef ans Graph Queries [LCT+主席树]

题面 bzoj上的强制在线版本 思路 首先可以确定,这类联通块相关的询问问题,都可以$LCT$+可持久化记录解决 用LCT维护生成树作为算法基础 具体而言,从前往后按照边的编号顺序扫一遍边 如果这条边两端不在同一个$LCT$联通块中,则$link$ 否则$cut$掉当前连接两条边的路径上的编号最小的边,并$link$ 记录$ntr[i]$表示第$i$条边触发第二种情况时$link$前$cut$掉的边的编号 如果触发第一种情况,则$ntr[i]=0$ 如果为自环,则$ntr[i]=i$ 这样记录之

【xsy2111】 【CODECHEF】Chef and Churus 分块+树状数组

题目大意:给你一个长度为$n$的数列$a_i$,定义$f_i=\sum_{j=l_i}^{r_i} num_j$. 有$m$个操作: 操作1:询问一个区间$l,r$请你求出$\sum_{i=l}^{r} f_i$. 操作2:将$a_x$变成$y$. 此题貌似正常做都不是很好做,考虑用一些奇奇怪怪的做法(比如说分块) 考虑到此题数列在不断地变化,我们考虑用树状数组来维护序列$a$,查询$f_i$的值可以在$O(log n)$的时间内完成. 如果这么做,单次询问的复杂度是$O(n log n)$的,

2019寒假小记

Preface 菜鸡HL终于艰难地熬过了初三的一个学期迎来了寒假. 但是由于某些不可言说的政策问题所以他要没高中读了,只能开始准备中考. 所以这个寒假可能并不像想象中的那样可以大量刷题好吧题还是要做的 希望\(ZJOI\)能\(Keep\ good\ luck\)吧,进不了前\(48\)就要考虑退役了. 1-26 早上搬东西发成绩单听老杨浩BB,搞到\(10\)点种才放. ZLX很早就走了,心想有点不对,肯定是去机房了. 所以推测HW的人都去机房了,于是我决定也去机房玩玩. 把东西拿到老爸车上就

codechef Chef and The Right Triangles 题解

Chef and The Right Triangles The Chef is given a list of N triangles. Each triangle is identfied by the coordinates of its three corners in the 2-D cartesian plane. His job is to figure out how many of the given triangles are right triangles. A right

CF&amp;&amp;CC百套计划2 CodeChef December Challenge 2017 Chef And his Cake

https://www.codechef.com/DEC17/problems/GIT01 #include<cstdio> #include<algorithm> using namespace std; #define N 101 char s[N]; int main() { int T; scanf("%d",&T); int n,m; int OddG,OddR,EvenG,EvenR; int ans; while(T--) { OddG=O