@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. PAT-1078 Hashing (散列表 二次探测法)

    1078. Hashing The task of this problem is simple: insert a sequence of distinct positive integers in ...

  2. vscode格式化Vue出现的问题:单引号变双引号 格式化去掉分号

    学习vue框架时,发现在使用vscode格式化vue代码时,出现单引号变成了双引号问题(导致和EsLint要求不一致),从而导致报错!!!!好坑啊!!! 解决方法如下 在文件根目录下创建 .prett ...

  3. Java——反射三种方式的效率对比

    转载自:https://blog.csdn.net/aitcax/article/details/52694423 1 使用field(效率最高)             long start = S ...

  4. 【Java8新特性】面试官:谈谈Java8中的Stream API有哪些终止操作?

    写在前面 如果你出去面试,面试官问了你关于Java8 Stream API的一些问题,比如:Java8中创建Stream流有哪几种方式?(可以参见:<[Java8新特性]面试官问我:Java8中 ...

  5. CF652E Pursuit For Aritifacts

    题目传送门 这是一道很好的练习强联通的题目. 首先,从题中可以看到,题目的要求就是要我们求出从起点到终点是否可以经过flag = 1 的边. 由于是无向图,且要求很多,直接暴力dfs会很凌乱. 那么, ...

  6. 集合概述及Collection接口的常用方法

    java集合像是一种容器,可以动态的把多个对象的引用放到容器中 java的集合类可以用于存储数量不等的多个对象,还可以用于保存具有映射关系的关联数组 package com.aff.coll; imp ...

  7. Rocket - interrupts - Nodes

    https://mp.weixin.qq.com/s/BlW4y0Ez1kppxvSHAla31A 简单介绍interrupts相关的diplomacy节点. 1. IntImp 中断节点实现: 1) ...

  8. Rocket - tilelink - Xbar

    https://mp.weixin.qq.com/s/UXFHYEQaYotWNEhshro68Q   简单介绍Xbar的实现.   ​​   1. 基本介绍   用于为Xbar的输入和输出连接生成内 ...

  9. [统计信息系列7] Oracle 11g的自动统计信息收集

    (一)统计信息收集概述 在Oracle 11g中,默认有3个自动任务,分别是:自动统计信息收集.SQL调优顾问.段空间调整顾问,查看方法如下: SQL> SELECT CLIENT_NAME,T ...

  10. JavaScript (三) js的基本语法 - - 数组 与函数 、关键字

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.关键字 1.break 关键字使用 break关键字:如果在循环中使用,遇到了break,则立刻跳出 ...