Frightful Formula

给你一个\(n\times n\)矩阵的第一行和第一列,其余的数通过如下公式推出:

\[f_{i,j}=a\cdot f_{i,j-1}+b\cdot f_{i-1,j}+c
\]

求\(f_{n,n}\mod (10^6+3)\)。

\(2≤n≤200000\)

zhouzhendong的题解

利用FFT来解决此题

这题的主要思路很巧妙。

先假设\(a=b=1\)

我们考虑对于每一个\(f_{i,j}\)计算它对\(f_{n,n}\)的贡献次数。

显然贡献次数就是在网格图中从\((i,j)\)开始只能往右或者往下走的路径条数,即\(\binom{n-i+n-j}{n-i}\)。

注意第一行和第一列的对答案的贡献式有点不同。

因为第一行的格子不能对右边的格子做贡献,所以第一行的格子\((1,i)\)的贡献次数就是\(\binom{2n-i-2}{n-i}\)。即第一步必须往下走。

同理,第一列的格子\((i,1)\)的贡献次数就是\(\binom{2n-i-2}{n-i}\)。

现在把\(a,b\)考虑进去

我们还要乘一个权值。考虑从第\(i\)行走到第\(n\)行向下走了\(n-i\)次,所以乘了\(n-i次b\),即乘了\(b^{n-i}\)。同理向右走要乘的权值就是\(a^{n-j}\)。所以综上所述,我们再重新写一下贡献次数的式子。

下面的三式满足\(i,j>1\)。注意\((1,1)\)是没有贡献次数的。

\[(1,i) \rightarrow \binom{2n-i-2}{n-i}a^{n-i}b^{n-1}\\
(i,1) \rightarrow \binom{2n-i-2}{n-i}a^{n-1}b^{n-i}\\
(i,j) \rightarrow \binom{2n-i-j}{n-i}a^{n-j}b^{n-i}
\]

考虑到\((i,j)\)这种格子的值里面含有\((i,1)\)和\((1,i)\)这种的贡献,贡献不能重复计算,所以我们在计算格子\((i,j)\)的时候就只考虑它产生的\(c\)对答案的贡献次数。(就是上面的那个)

所以,我们可以列出答案的式子:

\[ans=\sum_{i=2}^{n}f_{i,1}\cdot\binom{2n-i-2}{n-i}a^{n-1}b^{n-i}\\
+\sum_{i=2}^{n}f_{1,i}\cdot\binom{2n-i-2}{n-i}a^{n-i}b^{n-1}\\
+\sum_{i=2}^{n}\sum_{j=2}^{n}c\cdot\binom{2n-i-j}{n-i}a^{n-i}b^{n-j}
\]

各种逆元、阶乘以及幂的预处理就不说了。于是前面的两个式子都可以\(O(n)\)搞定。

后面的那个式子,我们再给他稍稍变几个形:

\[\sum_{i=2}^{n}\sum_{j=2}^{n}c\cdot\binom{2n-i-j}{n-i}a^{n-i}b^{n-j}
\]

把\(c\)提前,并修改求和指标,枚举\(n-i\)和\(n-j\),得:

\[=c\sum_{i=0}^{n-2}\sum_{j=0}^{n-2}\frac{(i+j)!}{i!j!}a^ib^j\\
=c\sum_{i=0}^{n-2}i!\sum_{j=0}^{n-2}\frac{a^{(i-j)}}{(i-j)!}\cdot\frac{b^j}{j!}
\]

\[f_i=\begin{cases}\large{\frac{a^i}{i!}}& \text{$(0\leq i\leq n-2)$}\\0& \text{$(n-2<i)$}\end{cases}\\
g_i=\begin{cases}\large{\frac{b^i}{i!}}& \text{$(0\leq i\leq n-2)$}\\0& \text{$(n-2<i)$}\end{cases}
\]

则原式可以写为:

\[c\sum_{i=0}^{n-2}(i+j)!\sum_{j=0}^{n-2}f_ig_j
\]

发现这个符合多项式卷积形式。于是我们再换一个写法:

\[=c\sum_{i=0}^{2n-4}i!\sum_{j=0}^{i}f_jg_{i-j}
\]

于是显然可以FFT快速计算了。注意,要取模,而且卷积得到的数字较大,可以用任意模数FFT或者拆系数FFT。时间复杂度\(O(n\log n)\)。

线性递推

我们把之前的式子继续推下去。

\[c\sum_{i=0}^{n-2}\sum_{j=0}^{n-2}\frac{(i+j)!}{i!j!}a^ib^j
\]

我们只需要考虑后面的式子,先不看\(c\)。

\[\sum_{i=0}^{n-2}\sum_{j=0}^{n-2}\binom{i+j}{i}a^ib^j
\]

\[f_n=\sum_{i=0}^{n}\sum_{j=0}^{n}\binom{i+j}{i}a^ib^j
\]

则我们要求的就是\(f_{n-2}\)。

推导:

\[f_n=\sum_{i=0}^{n}\sum_{j=0}^{n}\binom{i+j}{i}a^ib^j\\
=\sum_{i=0}^{n}a^i\sum_{j=0}^{n}\binom{i+j}{i}b^j\\
=\sum_{i=0}^{n-1}a^i\sum_{j=0}^{n-1}\binom{i+j}{i}b^j+a^n\sum_{j=0}^{n}\binom{n+j}{n}b^j+b^n\sum_{i=0}^{n}a^i\binom{i+n}{i}-\binom{2n}{n}a^nb^n\\
=f_{n-1}+a^n\sum_{i=0}^{n}\binom{n+i}{n}b^i+b^n\sum_{i=0}^{n}\binom{n+i}{n}a^i-\binom{2n}{n}a^nb^n
\]

我们只需要处理\(\sum_{i=0}^{n}\binom{n+i}{n}b^i\)和\(\sum_{i=0}^{n}\binom{n+i}{n}a^i\),就可以搞定了。

由于这两个形式一样,我这里只对a进行推导。

\[ga_n=\sum_{i=0}^{n}\binom{n+i}{n}a^i
\]

\[ga_n=\sum_{i=0}^n\binom{n+i}{i}a^i \\
= 1+\sum_{i=1}^{n-1}\left( \binom{n-1+i}{i}+\binom{n-1+i}{i-1} \right) a^i + \binom{2n}{n}a^n\\
= 1+ga_{n-1}-1+\sum_{i=0}^{n-2}\binom{n+i}{i}a^{i+1}+\binom{2n}{n}a^n\\
=ga_{n-1}+a\cdot ga_n-\binom{2n-1}{n-1}a^n-\binom{2n}{n}a^{n+1}+\binom{2n}{n}a^n\\
=ga_{n-1}+a\cdot ga_n+\binom{2n-1}{n}a^n-\binom{2n}{n}a^{n+1}
\]

移项

\[(1-a)ga_n=ga_{n-1}+\binom{2n-1}{n}a^n-\binom{2n}{n}a^{n+1}
\]

  • 当\(a\ne 1\)时,两边同时除以\(1-a\)

    \[ga_n=\frac{ga_{n-1}+\binom{2n-1}{n}a^n-\binom{2n}{n}a^{n+1}}{1-a}
    \]

  • 当\(a= 1\)时,直接把a=1代入移项后的式子里面

    \[(1-a)ga_n=ga_{n-1}+\binom{2n-1}{n}a^n-\binom{2n}{n}a^{n+1}\\
    \Longrightarrow ga_{n-1}=\binom{2n}{n}-\binom{2n-1}{n}=\binom{2n-1}{n-1}\\
    \Longrightarrow ga_{n}=\binom{2n+1}{n}
    \]

    就可以直接算\(ga_n\)了。

于是,

\[f_n=f_{n-1}+a^ngb_n+b^nga_n-\binom{2n}{n}a^nb^n
\]

综合上面的两种递推式,写三个递推就可以搞定本题了。时间复杂度\(O(n)\)。

co int N=200000+1;
int n,a,b,c,ans;
int fac[N<<1],ifac[N<<1],pa[N],pb[N];
int f[N],ga[N],gb[N]; il int binom(int n,int m){
return mul(fac[n],mul(ifac[m],ifac[n-m]));
} int main(){
read(n),read(a),read(b),read(c);
fac[0]=pa[0]=pb[0]=1;
for(int i=1;i<=n;++i){
pa[i]=mul(pa[i-1],a),pb[i]=mul(pb[i-1],b);
fac[i]=mul(fac[i-1],i);
}
for(int i=n+1;i<=n<<1;++i)
fac[i]=mul(fac[i-1],i);
ifac[n<<1]=fpow(fac[n<<1],mod-2);
for(int i=(n<<1)-1;i>=0;--i)
ifac[i]=mul(ifac[i+1],i+1);
read<int>();
for(int i=2;i<=n;++i)
ans=add(ans,mul(mul(read<int>(),binom((n<<1)-i-2,n-i)),mul(pa[n-1],pb[n-i])));
read<int>();
for(int i=2;i<=n;++i)
ans=add(ans,mul(mul(read<int>(),binom((n<<1)-i-2,n-i)),mul(pa[n-i],pb[n-1])));
f[0]=ga[0]=gb[0]=1;
int ia=fpow(add(1,mod-a),mod-2),ib=fpow(add(1,mod-b),mod-2);
for(int i=1;i<=n-2;++i){
ga[i]=a==1?binom((i<<1)+1,i):mul(add(ga[i-1],add(mul(binom((i<<1)-1,i),pa[i]),mod-mul(binom(i<<1,i),pa[i+1]))),ia);
gb[i]=b==1?binom((i<<1)+1,i):mul(add(gb[i-1],add(mul(binom((i<<1)-1,i),pb[i]),mod-mul(binom(i<<1,i),pb[i+1]))),ib);
f[i]=add(f[i-1],add(mul(pa[i],gb[i]),add(mul(pb[i],ga[i]),mod-mul(binom(i<<1,i),mul(pa[i],pb[i])))));
}
printf("%d\n",add(ans,mul(c,f[n-2])));
return 0;
}

LG4351 [CERC2015]Frightful Formula的更多相关文章

  1. bzoj 4451 : [Cerc2015]Frightful Formula FFT

    4451: [Cerc2015]Frightful Formula Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 177  Solved: 57[Sub ...

  2. BZOJ4451 : [Cerc2015]Frightful Formula

    $(i,1)$对答案的贡献为$l_iC(2n-i-2,n-i)a^{n-1}b^{n-i}$. $(1,i)$对答案的贡献为$t_iC(2n-i-2,n-i)*a^{n-i}b^{n-1}$. $(i ...

  3. BZOJ4451 [Cerc2015]Frightful Formula 多项式 FFT 递推 组合数学

    原文链接http://www.cnblogs.com/zhouzhendong/p/8820963.html 题目传送门 - BZOJ4451 题意 给你一个$n\times n$矩阵的第一行和第一列 ...

  4. Frightful Formula Gym - 101480F (待定系数法)

    Problem F: Frightful Formula \[ Time Limit: 10 s \quad Memory Limit: 512 MiB \] 题意 题意就是存在一个\(n*n\)的矩 ...

  5. Gym 101480F Frightful Formula(待定系数)题解

    #include<cmath> #include<set> #include<map> #include<queue> #include<cstd ...

  6. P4351-[CERC2015]Frightful Formula【组合数学,MTT】

    正题 题目链接:https://www.luogu.com.cn/problem/P4351 题目大意 \(n*n\)的矩形,给出第一行和第一列的数,剩下的满足\(F_{i,j}=a*F_{i,j-1 ...

  7. 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/常用套路【入门】

    原文链接https://www.cnblogs.com/zhouzhendong/p/Fast-Fourier-Transform.html 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/ ...

  8. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  9. Gym - 101480 CERC 15:部分题目题解(队内第N次训练)

    -------------------题目难度较难,但挺有营养的.慢慢补. A .ASCII Addition pro:用一定的形式表示1到9,让你计算加法. sol:模拟. solved by fz ...

随机推荐

  1. Postgresql中的large object

    1.初识postgresql large object 一位同事在对使用pg_dump备份出来的文件(使用plain格式)进行恢复时,觉得速度非常慢,让我分析一下是什么原因. 我拿到他的.bak文件, ...

  2. AOP实现事务和记录日志

    AOP (Aspect Oriented Programming) 将非功能性需求从功能性需求中剥离出来,解耦并且解决代码复用的问题,比如说权限控制,事务控制,记录操作日志,全局捕获异常等 @Aspe ...

  3. day40——数据库、数据库分类、安装、修改密码、字符集编码、简单语句介绍

    day40 详情请看:https://www.cnblogs.com/clschao/articles/9907529.html 数据库 数据库 简而言之可视为电子化的文件柜--存储电子文件的处所,用 ...

  4. AVR单片机教程——按键状态

    好久没更新了,今天开始继续,争取日更. 今天我们来讲按键.开发板的右下角有4个按键,按下会有明显的“咔嗒”声.如何检测按键是否被按下呢?首先要把按键或直接或间接地连接到单片机上.与之前使用的4个LED ...

  5. [洛谷P3966][TJOI2013]单词

    题目大意:有$n$个字符串,求每个字符串在所有字符串中出现的次数 题解:$AC$自动机,每个节点被经过时$sz$加一,每一个字符串出现次数为其$fail$树子树$sz$和 卡点:$AC$自动机根节点为 ...

  6. 阿里云最新Maven仓库地址 从此 我的maven依赖下载666~

    配置指南 maven配置指南 打开maven的配置文件(windows机器一般在maven安装目录的conf/settings.xml),在<mirrors></mirrors> ...

  7. Centos 7 替换镜像源

    1 备份原始源 [root@localhost ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.b ...

  8. 额。。。c++ sort()排序问题

    首先呢 记得 这是个快排 不稳定 基本格式 头文件 #include<algorithm> #include<iostream> bool cmp(int x,int y) { ...

  9. 爬虫 HttpHelper

    /// <summary> /// 类说明:HttpHelper类,用来实现Http访问,Post或者Get方式的,直接访问,带Cookie的,带证书的等方式,可以设置代理 /// 重要提 ...

  10. ICO学习说明

    IOC叫做控制反转,可以理解为我要做一件事,分为1,2,3,4这4部,我们可以在一个函数实现这四步,控制反转就是将这个流程体现在框架中.将原来实现在应用程序流程控制转移到框架中,框架利用一个引擎驱动整 ...