@codechef - JADUGAR2@ Chef and Same Old Recurrence 2
@description@
定义 dp 序列:
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 取模。
@solution@
考虑写出生成函数 \(F(x) = \sum_{i=0}dp(i)x^i\),得到:
\]
解方程得到 \(F(x) = \frac{(1-Ax)\pm\sqrt{(1-Ax)^2 - 4KBx}}{2B}\)。因为 F(x) 常数项为 0,舍弃一个根。有:
\]
尝试展开得到通项,发现展不开。
注意到当 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)\),最后可以得到这样一个结果(过程我就不给了,类似于上面的推导主要是太太太长了不想给):
\]
然后依然是对比第 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的更多相关文章
- [Codechef CHSTR] Chef and String - 后缀数组
[Codechef CHSTR] Chef and String Description 每次询问 \(S\) 的子串中,选出 \(k\) 个相同子串的方案有多少种. Solution 本题要求不是很 ...
- 【Codechef】Chef and Bike(二维多项式插值)
something wrong with my new blog! I can't type matrixs so I come back. qwq 题目:https://www.codechef.c ...
- 【CodeChef】Chef and Graph Queries
Portal --> CC Chef and Graph Queries Solution 快乐数据结构题(然而好像有十分优秀的莫队+可撤销并查集搞法qwq) 首先考虑一种方式来方便一点地..计 ...
- [CodeChef - GERALD07 ] Chef and Graph Queries
Read problems statements in Mandarin Chineseand Russian. Problem Statement Chef has a undirected gra ...
- CodeChef CHEFSOC2 Chef and Big Soccer 水dp
Chef and Big Soccer Problem code: CHEFSOC2 Tweet ALL SUBMISSIONS All submissions for this prob ...
- Codechef FNCS Chef and Churu
Disciption Chef has recently learnt Function and Addition. He is too exited to teach this to his fri ...
- CodeChef - FNCS Chef and Churu(分块)
https://vjudge.net/problem/CodeChef-FNCS 题意: 思路: 用分块的方法,对每个函数进行分块,计算出该分块里每个数的个数,这样的话也就能很方便的计算出这个分块里所 ...
- 【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 ...
- codechef T2 Chef and Sign Sequences
CHEFSIGN: 大厨与符号序列题目描述 大厨昨天捡到了一个奇怪的字符串 s,这是一个仅包含‘<’.‘=’和‘>’三种比较符号的字符串. 记字符串长度为 N,大厨想要在字符串的开头.结尾 ...
随机推荐
- ol,li,ul,dl,dt,dd
块级元素div尽量少用,其实和table一样,嵌套越少越好,它也是会影响速度的! ol 有序列表. <ol> <li>……</li> <li>……< ...
- Redis学习笔记(十三) 复制(下)
上一篇写了Redis复制功能的简单应用,下面我们看下Redis复制功能的实现过程.下面基本上是理论部分,枯燥乏味,但希望大家能看看,毕竟知识不都是感兴趣的.耐得住寂寞,经得起诱惑,方能守得住繁华 ~. ...
- 两圆相交求面积 hdu5120
转载 两圆相交分如下集中情况:相离.相切.相交.包含. 设两圆圆心分别是O1和O2,半径分别是r1和r2,设d为两圆心距离.又因为两圆有大有小,我们设较小的圆是O1. 相离相切的面积为零,代码如下: ...
- BZOJ1059 二分匹配
1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4810 Solved: 2297[Submit][Stat ...
- CF894C Marco and GCD Sequence
题目链接:http://codeforces.com/contest/894/problem/C 题目大意: 按照严格递增的顺序给出 \(m\) 个数作为公因数集,请你构造出一个数列,对于数列中的任意 ...
- 将BeyondCompare设置为TortoiseSVN的扩展比较工具
1)点击鼠标右键 -> 点击TortoiseSVN -> Settings,如下图: 2)选择Diff Viewer - > 选择External(并配置好参数),具体如下图: 3) ...
- centOS 6.8下使用Gparted进行分区扩容
centOS 6.8下使用Gparted进行分区扩容 机器环境:windows上运行的VMware虚拟机,系统为centOS 6.8. 由于前期分区分配空间过小,无法满足后续的数据存储预期,所 ...
- 跳出初学MySQL知识的原理整理(一)
一.基础架构 MySQL 可以分为 Server 层和存储引擎层两部分. Server 层包括连接器.查询缓存.分析器.优化器.执行器等,所有跨存储引擎 的功能都在这一层实现,比如存储过程.触发器.视 ...
- Linux学习(一):常用命令
init 0:关机 init 3:命令行模式 init 5:图形界面模式 init 6:重启 shutdown -h now:立马关机 ls:文件列表 参数:-l 详细列表 cd:切换目录 用法实例: ...
- C# 数据操作系列 - 19 FreeSql 入坑介绍
0. 前言 前几天FreeSql的作者向我推荐了FreeSql框架,想让我帮忙写个文章介绍一下.嗯,想不到我也能带个货了.哈哈,开个玩笑-看了下觉得设计的挺有意思的,所以就谢了这篇文章. 简单介绍一下 ...