题意

给你一个n*n矩阵的第一行和第一列,其余的数通过如下公式推出:
F[i,j]=a*f[i,j-1]+b*f[i-1,j]+c
求f[n][n]%(10^6+3)
2<=n<=200000
其余的数大于等于0小于等于10^6

分析

真是一道推式子的好题。。。

假设c=0,那么我们就考虑矩阵第一行和第一列对答案的贡献。
设某个点(i,j)走到(n,n),要向上走x步,向右走y步,也就是x=n-i,y=n-j
那么显然其对答案的贡献就是

Cxx+ybxay∗matrix[i][j]

C_{x+y}^xb^xa^y*matrix[i][j]
那么我们就可以单独算出第一行和第一列的贡献。
接下来考虑常数项c对答案的贡献。
显然我们要求的是

c∗∑i=0n−2∑j=0n−2Cii+jbiaj

c*\sum_{i=0}^{n-2}\sum_{j=0}^{n-2}C_{i+j}^ib^ia^j
将组合数拆开

c∗∑i=0n−2∑j=0n−2(i+j)!i!j!biaj

c*\sum_{i=0}^{n-2}\sum_{j=0}^{n-2}\frac{(i+j)!}{i!j!}b^ia^j

=c∗∑i=0n−2∑j=0n−2(i+j)!bii!ajj!

=c*\sum_{i=0}^{n-2}\sum_{j=0}^{n-2}(i+j)!\frac{b^i}{i!}\frac{a^j}{j!}
推到这步就可以发现,这是两个指数生成函数的卷积的系数和,就可以用fft来做了,但是我们的梦想是O(n)!那么久接着推
我们考虑斜着算贡献,也就是先算第一斜行的总贡献,再转移到第二斜行的总贡献。
显然第一斜行的总贡献为1
显然在主对角线之前(包括主对角线)的任意斜行的总贡献为其上一斜行的总贡献*(a+b)
那么只要一次算出没斜行的总贡献即可。但考虑过了主对角线之后会有多余的贡献,那么就要减去这些多余的贡献。

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;typedef long long LL;
const int N=400005;
const int MOD=1000003;int n,a,b,c,jc[N],ny[N],ma[N],mb[N];int read()
{int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}int ksm(int x,int y)
{int ans=1;while (y){if (y&1) ans=(LL)ans*x%MOD;x=(LL)x*x%MOD;y>>=1;}return ans;
}void prework()
{jc[0]=ny[0]=1;for (int i=1;i<=400000;i++){jc[i]=(LL)jc[i-1]*i%MOD;ny[i]=ksm(jc[i],MOD-2);}
}int main()
{prework();while (scanf("%d%d%d%d",&n,&a,&b,&c)!=EOF){int ans=0;ma[0]=mb[0]=1;for (int i=1;i<=n;i++) ma[i]=(LL)ma[i-1]*a%MOD,mb[i]=(LL)mb[i-1]*b%MOD;for (int i=1;i<=n;i++){int w=read();int x=n-i,y=n-1;if (i>1) ans=(ans+(LL)mb[x]*ma[y]%MOD*jc[x+y-1]%MOD*ny[x]%MOD*ny[y-1]%MOD*w%MOD)%MOD;}for (int i=1;i<=n;i++){int w=read();int x=n-1,y=n-i;if (i>1) ans=(ans+(LL)mb[x]*ma[y]%MOD*jc[x+y-1]%MOD*ny[x-1]%MOD*ny[y]%MOD*w%MOD)%MOD;}n--;int now=1,w=(a+b)%MOD;ans=(ans+c)%MOD;for (int i=1;i<n;i++){now=(LL)now*w%MOD;ans=(ans+(LL)now*c%MOD)%MOD;}int x1=0,y1=n-1,x2=n-1,y2=0;for (int i=1;i<n;i++){int w1=(LL)jc[x1+y1]%MOD*ny[x1]%MOD*ny[y1]%MOD*mb[x1]%MOD*ma[y1]%MOD;int w2=(LL)jc[x2+y2]%MOD*ny[x2]%MOD*ny[y2]%MOD*mb[x2]%MOD*ma[y2]%MOD;now=(now-(LL)w1+MOD)%MOD;now=(now-(LL)w2+MOD)%MOD;now=(LL)now*w%MOD;now=(now+(LL)w1*b%MOD)%MOD;now=(now+(LL)w2*a%MOD)%MOD;ans=(ans+(LL)now*c%MOD)%MOD;x1++;y2++;}printf("%d\n",ans);}return 0;
}

bzoj 4451: [Cerc2015]Frightful Formula 数学+排列组合相关推荐

  1. bzoj 4451 : [Cerc2015]Frightful Formula FFT

    4451: [Cerc2015]Frightful Formula Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 177  Solved: 57 [S ...

  2. BZOJ 4451: [Cerc2015]Frightful Formula

    Description 给你一个n*n矩阵的第一行和第一列,其余的数通过如下公式推出:  \(f_{i,j}=a\times f_{i,j-1}+b\times f_{i-1,j}+c\) 求\(f_ ...

  3. [FFT || 递推] BZOJ 4451 [Cerc2015]Frightful Formula

    f1,i f_{1,i} 的贡献是 f1,i∗an−i∗bn−1∗Cn−i2n−i−2 f_{1,i}*a^{n-i}*b^{n-1}*C_{2n-i-2}^{n-i} fi,1 f_{i,1} 同理 ...

  4. 计算机组装错题整理,数学排列组合部分错题精选.docx

    数学排列组合部分错题精选 数学复习易做易错题选 排列组合易错题正误解析 排列组合问题类型繁多.方法丰富.富于变化,稍不注意,极易出错.本文选择一些在教学中学生常见的错误进行正误解析,以飨读者. 1没有 ...

  5. 【一级讲解】不可思议唤来不可思议β——数学排列组合

    不可思议唤来不可思议β Time Limit: 1 Sec Memory Limit: 128 MB Description In the world line 1.048596% 双叶理央因为&qu ...

  6. 【牛客每日一题】4.16 逆序对 ( 数学 , 排列组合 ,快速幂 , 快速乘 )

    [每日一题]逆序对 链接:https://ac.nowcoder.com/acm/problem/14731 来源:牛客网 题目描述 求所有长度为n的01串中满足如下条件的二元组个数: 设第i位和第j ...

  7. 自编高中数学---排列组合公式推导

    知乎一个竞赛生写的排列组合文章:https://www.zhihu.com/question/26094736 一.排列 ,Permutaion 把n件东西往m个位置里排序,有多少种排法? 记排列方法 ...

  8. C语言-实现数学排列组合里的排列算法

    本文将编写一个函数实现数学排列的功能,采用的办法是递归.具体功能如图所示: 一.函数的讲解 1.1 函数的原型 函数的原型:int** Permutation(int* iarr,int size): ...

  9. 【bzoj 4451】[Cerc2015]Frightful Formula - 递推

    才没有在做cerc2015呢 看到好像不少人这题写fft卡得死死的啊,不如 O(n) O(n) 递推(雾) 首先可以观察出 (i,1) (i,1)这个格子为 x x时对(n,n)(n,n) a,b a ...

最新文章

  1. 四种类型的数据分析模式
  2. ERP内部顾问与外部顾问的区别
  3. python 删除变量_DAY1-step4 Python变量:声明,连接变量,全局和局部
  4. STM32 USART1 USART2 UASRT3 UART4 UART5串口通信测试程序
  5. wifi名称可以有空格吗_收购公司后可以变更公司名称吗,变更公司名称和股权如何处理?...
  6. P4011 孤岛营救问题
  7. oracle非常量不能用于privot_Oracle 行列转换函数pivot、unpivot的使用(二)
  8. C++中用函数模板实现和优化抽象操作
  9. POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新
  10. IoT:加密与安全:几种常用安全加密算法原理与用途解析
  11. 【SNE-RoadSeg 解读】结合表面法向量的路面分割网络(ECCV2020)
  12. 灭菌仓密封性测试方案
  13. linux开发视角root手机并部署相关开发工具
  14. 《深度学习》学习笔记(十二)
  15. 【算法设计zxd】第四章蛮力法 1.枚举法 02穷举查找
  16. Elastic-Job开发指南
  17. 童年记忆中的湾里老爷爷
  18. 内弹道仿真matlab全代码
  19. 优雅的启动nginx。。。bat命令。一键开启关闭
  20. 哪些行业网站适合使用虚拟主机托管?

热门文章

  1. 论文参考文献的引用,以及检查和查看
  2. php 四舍五入到分,PHP四舍五入精确小数位及取整
  3. Maven构建Java使用代理,请求API接口
  4. matlab svd降维测试数据集,SVD降维
  5. C#中Console.WriteLine()与Console.Write的区别
  6. 机器学习算法:决策树算法
  7. Android程序的几个组成部分,Android应用程序开发的四个重要组成部分
  8. 碎片化学习和系统学习的选择
  9. python 同花顺thstrader_Easytrader踩坑记(一)
  10. 乖离性暗机器人_乖离性百万亚瑟王超弩级暗机器人打法攻略