Matrix

本文探讨了给定矩阵的第一行和第一列后,如何通过递推公式计算矩阵右下角元素的值,并提供了一种高效的解决方案及代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

给定两个长度为 n  n 的整数序列 l  l  t  t ,分别作为 n×n  n×n 矩阵 F  F 的第一列和第一行,并且保证 l1=t1  l1=t1 。同时矩阵中的任意其他元素 Fi,j  Fi,j 由以下递推给定:

Fi,j=aFi,j1+bFi1,jFi,j=a⋅Fi,j−1+b⋅Fi−1,j

给定系数 a,b,  a,b, 要求计算 Fn,n  Fn,n  109+7  109+7 的值。

Input

第一行包含三个整数 n,a,b n,a,b
第二行包含 n  n 个整数 li li
第三行包含 n| n|个整数 ti ti

Output

共一行包括一个整数,表示 Fn,n  Fn,n  109+7  109+7 的值。

Sample Input

4 3 5
4 1 7 3
4 7 4 8

Sample Output

59716

Data Constraint

n,a,b,li,ti100000n,a,b,li,ti≤100000

Solution

可以看出,对于每项都有固定的曼哈顿距离到达终点,因此他们关于 ab  a,b 的系数是固定的。
再者还要算出每一项到达终点的路径数。
所以对于每一项 ti  ti 的贡献有 Cn22ni2anibn1 C2n−i−2n−2∗an−i∗bn−1, li  li  的贡献则类似。

Code

const   mo=1000000007;
var     n,i:longint;
        ans,t,k,x,y:int64;
        c,a,b,l,r:array[0..100005] of int64;
function ni(x:int64):int64;
var y,ans:int64;
begin
    y:=mo-2;
    ans:=1;
    while y<>0 do begin
        if y mod 2=1 then ans:=ans*x mod mo;
        x:=x*x mod mo;
        y:=y div 2;
    end;
    exit(ans);
end;
begin
    readln(n,a[1],b[1]);
    dec(n);
    for i:=n downto 0 do read(r[i]);readln;
    for i:=n downto 0 do read(l[i]);
    k:=1;t:=1;
    while k<n do begin
        t:=t*k mod mo;
        k:=k+1;
    end;
    x:=1;y:=t*n mod mo;
    c[0]:=1;c[1]:=n;
    for i:=2 to n-1 do begin
        x:=x*i mod mo;
        y:=y*(i+n-1) mod mo;
        c[i]:=y*ni(t*x mod mo) mod mo;
    end;
    a[0]:=1;b[0]:=1;
    for i:=2 to n do begin
        a[i]:=a[i-1]*a[1] mod mo;
        b[i]:=b[i-1]*b[1] mod mo;
    end;
    for i:=0 to n-1 do begin
        ans:=(ans+c[i]*l[i] mod mo *a[i] mod mo*b[n] mod mo) mod mo;
        ans:=(ans+c[i]*r[i] mod mo *a[n] mod mo*b[i] mod mo) mod mo;
    end;
    writeln(ans);
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值