@description@

定义 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\),对 10^9 + 7 取模。

原题戳我查看owo

@solution@

考虑写出生成函数 \(F(x) = \sum_{i=0}dp(i)x^i\),得到:

\[F(x) = Ax\times F(x) + B\times F^2(x) + Kx
\]

解方程得到 \(F(x) = \frac{(1-Ax)\pm\sqrt{(1-Ax)^2 - 4KBx}}{2B}\)。因为 F(x) 常数项为 0,舍弃一个根。有:

\[F(x) = \frac{(1-Ax)-\sqrt{(1-Ax)^2 - 4KBx}}{2B}
\]

尝试展开得到通项,发现展不开。

注意到当 A = 0 时就是个类似于卡特兰数的数列了,而卡特兰数众所周知有一个递推式子 \(f_n = \frac{4n-2}{n+1}f_{n-1}\)。

考虑给题目的数列找一个递推式子。首先我们考虑一下怎么通过生成函数得到卡特兰数的递推式子。

-----手动分割线-----

记 \(G(x) = \sum_{i=0}f_ix^i\),即卡特兰数的生成函数,众所周知 \(G(x) = \frac{1 - \sqrt{1-4x}}{2x}\)。

考虑对 \(G(x)\) 求导得到 \(G'(x) = \sum_{i=0}(i+1)\times f_{i+1}x^i\),根据求导法则有 \(G'(x) = \frac{(2x-1)\sqrt{1-4x}-4x+1}{8x^3 - 2x^2}\)。

因为 \(G(x) = \frac{1 - \sqrt{1-4x}}{2x}\),可以得到 \(\sqrt{1-4x} = 1 - 2xG(x)\),直接代入上式得到 \(G'(x) = \frac{-2xG(x)+G(x)+1}{4x^2-x}\)。

稍微变形可得 \((4x^2-x)G'(x) + (2x-1)G(x) = 1\)。

对比等式两边第 n 项的系数(假设 n ≠ 0),有 \(4(n-1)f_{n-1} - nf_{n} + 2f_{n-1} - f_{n} = 0\)。然后就可以得到 \(f_n = \frac{4n-2}{n+1}f_{n-1}\) 的结果。

-----手动分割线-----

该题也是类似的处理:求出 \(F'(x)\) 的表达式,用 \(F(x)\) 表示出根号项并代入 \(F'(x)\),最后可以得到这样一个结果(过程我就不给了,类似于上面的推导主要是太太太长了不想给):

\[(A^2x^2 - (4BK + 2A)x + 1)F'(x) + ((A + 2BK) - A^2x)F(x) = AKx + K
\]

然后依然是对比第 n 项系数(n > 1),得到 \(A^2(n-1)\times dp(n-1) - 2(A + 2BK)n\times dp(n) + (n+1)\times dp(n+1) + (A + 2BK)dp(n) - A^2dp(n-1) = 0\)

于是得到递推式 \((n+1)dp(n+1) = (2n - 1)(A + 2BK)dp(n) - A^2(n-2)dp(n-1)\)。

即 \(dp(n) = \frac{(2n - 3)(A + 2BK)dp(n) - A^2(n-3)dp(n-2)}{n}\)。

然后就没了。直接 O(N) 预处理。

@accepted code@

#include <cstdio>

const int MAXN = 10000000;
const int MOD = int(1E9) + 7;
int add(int a, int b) {return a + b >= MOD ? a + b - MOD : a + b;}
int sub(int a, int b) {return a - b < 0 ? a - b + MOD : a - b;}
int mul(int a, int b) {return 1LL*a*b%MOD;} int N, K, A, B, Q; int f[MAXN + 5], inv[MAXN + 5];
void init() {
inv[1] = 1;
for(int i=2;i<=N;i++)
inv[i] = (MOD - 1LL*(MOD/i)*inv[MOD%i]%MOD); int p = add(A,mul(2*K,B)), q = mul(A,A);
f[1] = K, f[2] = mul(K,add(A,mul(B,K)));
for(int i=3;i<=N;i++)
f[i] = mul(inv[i],sub(mul(mul(p,2*i-3),f[i-1]),mul(mul(q,i-3),f[i-2]))); for(int i=1;i<=N;i++) f[i] = add(f[i-1],mul(f[i],f[i]));
} int main() {
scanf("%d%d%d%d", &N, &K, &A, &B), init();
scanf("%d", &Q);
for(int i=1;i<=Q;i++) {
int L, R; scanf("%d%d", &L, &R);
printf("%d\n", sub(f[R], f[L-1]));
}
}

@details@

查了很久都没有查到卡特兰数的递推公式的生成函数证法(甚至翻到了wiki上去都没有。。。)。

一看题解,woc 还有求导这种操作。

早知道就不花几个晚上思考了。。。直接翻题解不挺好的。。。

@codechef - JADUGAR2@ Chef and Same Old Recurrence 2的更多相关文章

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

    [Codechef CHSTR] Chef and String Description 每次询问 \(S\) 的子串中,选出 \(k\) 个相同子串的方案有多少种. Solution 本题要求不是很 ...

  2. 【Codechef】Chef and Bike(二维多项式插值)

    something wrong with my new blog! I can't type matrixs so I come back. qwq 题目:https://www.codechef.c ...

  3. 【CodeChef】Chef and Graph Queries

    Portal --> CC Chef and Graph Queries Solution 快乐数据结构题(然而好像有十分优秀的莫队+可撤销并查集搞法qwq) 首先考虑一种方式来方便一点地..计 ...

  4. [CodeChef - GERALD07 ] Chef and Graph Queries

    Read problems statements in Mandarin Chineseand Russian. Problem Statement Chef has a undirected gra ...

  5. CodeChef CHEFSOC2 Chef and Big Soccer 水dp

    Chef and Big Soccer   Problem code: CHEFSOC2 Tweet     ALL SUBMISSIONS All submissions for this prob ...

  6. Codechef FNCS Chef and Churu

    Disciption Chef has recently learnt Function and Addition. He is too exited to teach this to his fri ...

  7. CodeChef - FNCS Chef and Churu(分块)

    https://vjudge.net/problem/CodeChef-FNCS 题意: 思路: 用分块的方法,对每个函数进行分块,计算出该分块里每个数的个数,这样的话也就能很方便的计算出这个分块里所 ...

  8. 【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 ...

  9. codechef T2 Chef and Sign Sequences

    CHEFSIGN: 大厨与符号序列题目描述 大厨昨天捡到了一个奇怪的字符串 s,这是一个仅包含‘<’.‘=’和‘>’三种比较符号的字符串. 记字符串长度为 N,大厨想要在字符串的开头.结尾 ...

随机推荐

  1. mysql运维入门1:基础及备份还原

    存储引擎 myisam 表强调的是性能 执行速度比innodb类型更快 不提供事务支持 如果执行大量的select操作,是首选 支持表锁,不支持行锁 innodb 提供事务支持.外键等高级数据库功能 ...

  2. 关于mysql的metadata lock

    昨天晚上上线,却发现一个ddl语句长时间没有生效 查processlist, 发现包括ddl语句在内的众多查询提示 “Waiting for table metadata lock” 唯一没有该提示的 ...

  3. WXML属性一览表

    id属性 <view id="xxx"></view> class属性 <view class="xxx"></vie ...

  4. 请求地址中出现中文或者URL作为参数,为避免含有特殊字符截断URL,需要编码

    URL中担心出现特殊符号!*'();:@&=+$,/?%#[] 从而截断完整的URL,需要对URL编码,服务端对URL再解码 参考: https://blog.csdn.net/aaaaazq ...

  5. hrb

  6. 使用records库操作SQL并且查询MySQL数据库

    获取数据库 db = records.Database('mysql://root:xxxx@47.106.151.165/web_table?charset=utf8')注释:xxxx为数据密码 执 ...

  7. vue中 transition组件使用总结

    博客园比较啃爹啊,随笔只能手写,之前写在有道云笔记里面的内容也复制不了,忧伤..... 长话短说,看官方的transition 的讲解,可能是内容太多了,或者就是本人太辣鸡了,看的有点懵逼,但是项目中 ...

  8. Element Form表单实践(下)

    作者:小土豆biubiubiu 博客园:https://www.cnblogs.com/HouJiao/ 掘金:https://juejin.im/user/58c61b4361ff4b005d9e8 ...

  9. [JavaWeb基础] 004.用JSP + SERVLET 进行简单的增加删除修改

    上一次的文章,我们讲解了如何用JAVA访问MySql数据库,对数据进行增加删除修改查询.那么这次我们把具体的页面的数据库操作结合在一起,进行一次简单的学生信息操作案例. 首先我们创建一个专门用于学生管 ...

  10. 离散的差分进化Discrete DE

    一般的差分算法的变异规则:Xmutation=Xr1+F(Xr2-Xr3),F为缩放因子, 离散差分进化DDE的变异规则:设每个解为K个元素的集合,则Xr2-Xr3:求出Xr2与Xr3有m个共同元素, ...