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. [04]Go设计模式:抽象工厂模式(Abstract Factory Pattern)

    目录 抽象工厂模式 一.简介 二.代码 三. 参考资料 抽象工厂模式 一.简介 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂 ...

  2. SpringMVC的拦截器讲解

    Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理. 用户可以自己定义一些拦截器来实现特定的功能. 谈到拦截器,还要向大家提一个词 ...

  3. log sum of exponential

    The so-called “log sum of exponentials” is a functional form commonly encountered in dynamic discret ...

  4. /x86_64-linux-gnu/libSM.so: undefined reference to `uuid_generate@UUID_1.0'错误

    在编译PCL的时候总是报错,其他人都没问题 后来发现是我cmakePCL的时候,QT引用的是anaconda里的qt,把这个一改果然没问题了,耽误了一天时间. 感谢stack上这位老铁

  5. windows10 ubuntu子系统运行docker出现的问题

    前一篇笔记记录了安装的过程及错误处理办法,但是在正式使用docker时,却又出现新的问题: “docker: Cannot connect to the Docker daemon at unix:/ ...

  6. 程序员生存之道,多写bug!

    1.代码写得好,bug少,看起来就像闲人. 2.注释多,代码清晰,任何人接手非常方便,看起来谁都都可以替代. 3.代码写得烂,每天风风火火改bug,各种救火,解决各种线上重大问题,于是顺理成章为公司亮 ...

  7. python实现查找最长公共子序列

    #!/usr/bin/python # -*- coding: UTF-8 -*- worlds = ['fosh','fort','vista','fish','hish','hello','ohd ...

  8. STL对map排序

    // sort start typedef struct{ ... }Node; // Map的键是字符串,值是结构体.虽然有自动排序特性,但是按字符串的排序并不能符合要求.此时,Map的key可以视 ...

  9. Wing电信平台操作方法

    Wing电信平台操作文档 当前文档编制于2019/9/3 一.登陆 登陆网址 https://www.ctwing.cn/ 点击右上角控制台 点击左侧栏点击产品中心 选择需要注册的产品 二.注册设备 ...

  10. T-SQL行列相互转换命令:PIVOT和UNPIVOT使用详解

    最近在维护一个ERP 做二次开发 ,在查找数据源的时候看到前辈写的SQL ,自己能力有限 ,就在网上找找有关这几个关键字的使用方法.做出随笔以做学习之用 T-SQL语句中,PIVOT命令可以实现数据表 ...