【JZOJ 4709】 Matrix

37 篇文章 0 订阅

Description

这里写图片描述
这里写图片描述

Analysis

这题是水数学题。
可以暴力手玩一下,于是可以发现神奇的规律。
当然,更可以感性地推导出 Fn,n
网格、递推式,你想到了什么?
网格中一点走到另一点的方案数!
但是这是改编的,有点不同。
首先对于任意一个位置的值往右走等价于乘 a ,往下走等价于乘b,那么对于l和t,看看这个位置往右往下走多少步就是最后答案中a和b的指数。
系数呢?显然就是方案数。但是(1,i)不能走到(1,i+1),(i,1)不能走到(i+1,1),所以把(1,i)或(i,1)的坐标移右(下)一格再计算。对于(0,0)往右或往上走到(n,m)的方案数,为 Cnm+n

Code

#include<cstdio>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const ll N=100010,mo=1e9+7;
ll n,a,b,l[N],t[N],fac[N*2];
ll qmi(ll x,ll n)
{
    ll t=1;
    for(;n;n>>=1)
    {
        if(n&1==1) t=t*x%mo;
        x=x*x%mo;
    }
    return t;
}
ll ny(ll x)
{
    return qmi(x,mo-2);
}
ll C(ll m,ll n)
{
    return fac[m]*ny(fac[n]*fac[m-n]%mo)%mo;
}
int main()
{
    scanf("%lld %lld %lld",&n,&a,&b);
    fo(i,1,n) scanf("%lld",&l[i]);
    fo(i,1,n) scanf("%lld",&t[i]);
    if(n==1)
    {
        printf("%lld",l[1]);
        return 0;
    }
    fac[0]=1;
    fo(i,1,2*n) fac[i]=fac[i-1]*i%mo;
    ll x=0,y=0;
    fo(i,2,n)
    {
        ll c=C(2*n-i-2,n-2);
        x=(x+c*l[i]%mo*qmi(b,n-i)%mo)%mo,y=(y+c*t[i]%mo*qmi(a,n-i))%mo;
    }
    printf("%lld",(qmi(a,n-1)*x%mo+qmi(b,n-1)*y%mo)%mo);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值