Problem F: Frightful Formula

\[Time Limit: 10 s \quad Memory Limit: 512 MiB
\]

题意

题意就是存在一个\(n*n\)的矩阵\(f[n][n]\)。然后给出\(n,a,b,c\),在给出两个序列\(l[n],t[n]\)。

定义矩阵如下:

\[\begin{aligned}
f[i][1] &= l[i] \\
f[1][i] &= t[i] \\
f[i][j] &= a*f[i][j-1] + b*f[i-1][j] + c
\end{aligned}
\]

求出\(f[n][n]\%mod\)的值。

思路

题目要求\(f[n][n]\),如果我们会求\(f[n][m]\),那么\(f[n][n]\)自然也会了,下面我给出推导过程。

  1. 首先考虑\(a=1, b=1, c=0\)的情况

\[f[i][j] = f[i][j-1] + f[i-1][j]
\]

显然,\(f[n][m]\)可以看成从\((1,1)\)走到\((n,m)\),每一步只能向下或者向右的方案数。也就是一共要走\(n+m-2\)步,其中\(n-1\)往下走,答案就是\(C_{n+m-1}^{n-1}\)或者\(C_{n+m-1}^{m-1}\)。

2. 接下来考虑\(a \not= 1,b \not= 1,c=0\)的情况。

\[f[i][j] = a*f[i][j-1] + b*f[i-1][j]
\]

这时候每一步向右走贡献一个\(a\),向下走贡献一个\(b\)。

  • 我们先考虑第一行每个点对终点的贡献,例如\(f[1][i]\),他到终点一共需要向右走\(m-i\)次,向下走\(n-1\)次,所以一个方案贡献了\(f[1][i]*a^{m-i}b^{n-1}\)。那么如何计算方案数呢?为了避免重复计算,需要先向下走一步然后从(2,i)到(n,m),一共的方案数就是\(C_{n+m-i-2}^{n-2}\)。所以对于第一行总贡献就是\(\sum_2^m f[1][i]*C_{n+m-i-2}^{n-2}*a^{m-i}b^{n-1}\)。
  • 对于列来说,同样的道理,一个方案贡献了\(f[i][1]*a^{m-1}b^{n-i}\),然后先向右走一步防止重复计算,方案数为\(C_{n+m-i-2}^{m-2}\)。所以第一列的总贡献就是\(\sum_2^nC_{n+m-i-2}^{m-2}*a^{m-1}b^{n-i}\)。

    所以只要\(O(N)\)遍历第一行,第一列,就能算出\(f[n][m]\)。
  • 多说一句,这样做是因为第一行、第一列的数和\(f[1][1]\)没有关系,如果直接给出\(f[1][1]\),然后求\(f[n][m]\)那么直接就可以算出答案\(f[1][1]*C_{n+m-2}^{n-1}*a^{m-1}b^{n-1}\)
  1. 最后考虑\(a \not= 1,b \not= 1,c\not=0\)的情况。

\[f[i][j] = a*f[i][j-1] + b*f[i-1][j] + c
\]

如果没有\(c\),好做,但是有\(c\)怎么办呢?有没有办法把\(c\)去掉?

答案是有的。

我们令\(g[i][j] = f[i][j] + k\),如果存在一个\(k\)满足

\[g[i][j] = a*g[i][j-1] + b*g[i-1][j]
\]

那么问题就转化到了2问题去了。

其实\(k\)也很好求,直接带入把\(g[i][j]\)拿\(f[i][j]+k\)代入。

\[\begin{aligned}
f[i][j]+k &= a*(f[i][j-1]+k) + b*(f[i-1][j]+k)\\
&= a*f[i][j-1] + b*f[i-1][j] + c
\end{aligned}
\]

容易得到\(k = \frac{c}{a+b-1} = c*inv(a+b-1)\),所以做的时候把\(f[1][i]、f[i][1]\)转化成\(g[1][i]、g[i][1]\)求出\(g[n][m]\),最后在换回\(f[n][m]\)就可以了。

/***************************************************************
> File Name : F.cpp
> Author : Jiaaaaaaaqi
> Created Time : 2019年05月06日 星期一 14时35分10秒
***************************************************************/ #include <map>
#include <set>
#include <list>
#include <ctime>
#include <cmath>
#include <stack>
#include <queue>
#include <cfloat>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define lowbit(x) x & (-x)
#define mes(a, b) memset(a, b, sizeof a)
#define fi first
#define se second
#define pii pair<int, int> typedef unsigned long long int ull;
typedef long long int ll;
const int maxn = 2e5 + 10;
const int maxm = 4e5 + 10;
const ll mod = 1e6 + 3;
const ll INF = 1e18 + 100;
const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
const double eps = 1e-8;
using namespace std; ll n, m, a, b, c;
int cas, tol, T; ll fac[maxm], inv[maxm];
ll l[maxn], t[maxn]; ll fpow(ll a, ll b) {
ll ans = 1;
while(b) {
if(b&1) ans = ans*a%mod;
a = a*a%mod;
b >>= 1;
}
return ans;
} void handle() {
fac[0] = inv[0] = 1;
int mx = 2*n;
for(int i=1; i<=mx; i++) {
fac[i] = fac[i-1]*i%mod;
}
inv[mx] = fpow(fac[mx], mod-2);
for(int i=mx-1; i>=1; i--) {
inv[i] = inv[i+1]*(i+1)%mod;
}
} ll C(int n, int m) {
return fac[n]*inv[m]%mod*inv[n-m]%mod;
} int main() {
scanf("%lld%lld%lld%lld", &n, &a, &b, &c);
ll k = c*fpow(a+b-1, mod-2)%mod;
handle();
for(int i=1; i<=n; i++) {
scanf("%lld", &l[i]);
l[i] = (l[i]+k)%mod;
}
for(int i=1; i<=n; i++) {
scanf("%lld", &t[i]);
t[i] = (t[i]+k)%mod;
}
ll ans = 0ll;
for(int i=2; i<=n; i++) {
ans += l[i] * fpow(b, n-i)%mod * fpow(a, n-1)%mod * C(2*n-i-2, n-2)%mod;
ans %= mod;
}
for(int i=2; i<=n; i++) {
ans += t[i] * fpow(b, n-1)%mod * fpow(a, n-i)%mod * C(2*n-i-2, n-2)%mod;
ans %= mod;
}
ans = ((ans-k)%mod+mod)%mod;
printf("%lld\n", ans);
return 0;
}

Frightful Formula Gym - 101480F (待定系数法)的更多相关文章

  1. bzoj 4451 : [Cerc2015]Frightful Formula FFT

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

  2. LG4351 [CERC2015]Frightful Formula

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

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

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

  4. Ceizenpok’s formula Gym - 100633J 扩展Lucas定理 + 中国剩余定理

    http://codeforces.com/gym/100633/problem/J 其实这个解法不难学的,不需要太多的数学.但是证明的话,我可能给不了严格的证明.可以看看这篇文章 http://ww ...

  5. F - Fraction Formula Gym - 102307F

    Mr. Potato Head has been promoted and now is a math professor at the UNAL. For his first course he i ...

  6. 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 ...

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

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

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

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

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

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

随机推荐

  1. word 转 pfd

    转自: https://www.cnblogs.com/qiwu1314/p/6101400.html demo: public class Doc2Pdf { public static boole ...

  2. day58——模板继承、组件、自定义标签和过滤器、inclusion_tag、静态文件配置、url别名和反向解析、url命名空间

    day58 模板相关 模板继承(母版继承) 1. 创建一个xx.html页面(作为母版,其他页面来继承它使用) 2. 在母版中定义block块(可以定义多个,整个页面任意位置) {% block co ...

  3. memcached源码分析一-slab

    Slab作为一种内存管理方案,其作用主要有以下2点: a) 避免频繁的内存分配释放造成的内存碎片 b) 减少内存分配操作产生的性能开销 Linux内核数据结构中也有slab的设计,Linux提供了一套 ...

  4. spring cloud应用

    1.什么是注册中心 (1)就是首先有一个eureka server,服务的注册与发现的中心(2)你如果写好了一个服务,就可以将其注册到eureka server上去(3)然后别人的服务如果要调用你的服 ...

  5. using 语句(C# 参考)(转载)

    using 语句 提供可确保正确使用 IDisposable对象的方便语法. 示例 下面的示例演示如何使用 using 语句. using (var font1 = new Font("Ar ...

  6. Python网络编程、爬虫之requests模块使用

    一.python操作网络,也就是打开一个网站,或者请求一个http接口,使用urllib模块. urllib模块是一个标准模块,直接import urllib即可,在python3里面只有urllib ...

  7. datax分析与思考(一)

    Datax 总体流程图 先看执行的第一个步骤: 在最上层抽象类,这个里面相当于获取全局公共信息,java入口部分就是这个Engine的main方法直接启动 Engine 启动 com.alibaba. ...

  8. Django--模型层进阶

    目录 QuerySet对象 可切片 可迭代 惰性查询 缓存机制 何时查询集不会被缓存? exists()与iterator()方法 exists() iterator() 中介模型 查询优化 表数据 ...

  9. 锤子剪刀布pat-1018

    题目描述 大家应该都会玩“锤子剪刀布”的游戏:现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入描述: 输入第1行给出正整数N(<=105),即双方交 ...

  10. 嵌入式Web服务器boa在ARM平台的移植步骤

    1.下载http://www.boa.org/ 2.解压tar xzf boa-0.94.13.tar.gz 3.编译cd boa-0.94.13/src./configure 生成了makefile ...