@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,大厨想要在字符串的开头.结尾 ...
随机推荐
- django 中CBV和FBV 路由写法的区别
使用视图函数时, FBV: django完成URL解析之后,会直接把request对象以及URL解析器捕获的参数(比如re_path中正则表达捕获的位置参数或关键字参数)丢给视图函数 CBV: 这些参 ...
- java循环map
Iterator<Entry<String,Integer>> it = exsitMap.entrySet().iterator(); while(it.hasNext()) ...
- 太高效了!玩了这么久的Linux,居然不知道这7个终端快捷键!
大家好,我是良许. 作为 Linux 用户,大家肯定在 Linux 终端下敲过无数的命令.有的命令很短,比如:ls .cd .pwd 之类,这种命令大家毫无压力.但是,有些命令就比较长了,比如: $ ...
- SpringBoot踩坑日记
1.Closing JPA EntityManagerFactory for persistence unit 'default'错误导致springboot启动后终止 --------------- ...
- TP5.0验证器使用方法
比如我要在分类做一个验证器,首先要在你的后台模块先建立一个文件夹,比如我的后台模块是admin,那么你要在admin里面建立一个validate的文件夹然后再建立一个对应的php文件如下图 文件里面的 ...
- [批处理教程之Git]001.Git 常用命令大全
基本技巧 1.安装后的第一步 安装git后,第一件事你需要设置你的名字和邮箱,因为每次提交都需要这些信息. $ git config --global user.name "Some One ...
- Java多线程--synchronized的用法
全面介绍Synchronized:https://blog.csdn.net/luoweifu/article/details/46613015 synchronized class/this/obj ...
- python winreg总结
注册表 结构 注册表由键(key,或称“项”).子键(subkey,子项)和值项(value)构成.一个键就是树状数据结构中的一个节点,而子键就是这个节点的子节点,子键也是键.一个值项则是一个键的一条 ...
- 50个SQL语句(MySQL版) 问题六
--------------------------表结构-------------------------- student(StuId,StuName,StuAge,StuSex) 学生表 tea ...
- ES6背记手册
ES6规范 阮一峰的ES6在线教程 在线图书--Exploring ES6 ES6 tutorials babel在线教程--https://babeljs.io/docs/en/learn.html ...