【NOIP模拟】Matrix

来源:互联网 发布:d3.js 力学图 编辑:程序博客网 时间:2024/06/07 12:57

Description

这里写图片描述

Solution

一道大大的找规律题。
从每个l和t走到右下角,对于每个l、t,a和b的次数都是确定的,然后可以算出每个l和t走到右下角a和b的次数。
对于l走到右下角的a和b的状况会是an1bni,t的状况会是anibn1
但是走到右下角的路径会有很多种情况,用组合数算一下就是Cn22ni2
所以预处理一下阶乘和阶乘的逆元就好了。

Code

#include<iostream> #include<cstdio>#include<algorithm>#include<cmath>#include<cstring>#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;const int mo=1000000007,maxn=200007;typedef long long ll;ll i,j,k,n,m;ll l[maxn],t[maxn],xi,shang,xia1,xia2,a,b;ll jie[maxn],ni[maxn],cia[maxn],cib[maxn],ans;ll qsm(ll x,ll y){    ll z=1;    while(y){        if(y&1)z=z*x%mo;        y/=2;        x=x*x%mo;    }    return z;}int main(){//  freopen("fan.in","r",stdin);    scanf("%lld%lld%lld",&n,&a,&b);    fo(i,1,n)scanf("%lld",&t[i]);    fo(i,1,n)scanf("%lld",&l[i]);    cia[0]=cib[0]=1;    fo(i,1,n){        cia[i]=(cia[i-1]*a)%mo;        cib[i]=(cib[i-1]*b)%mo;    }    jie[0]=1;    fo(i,1,2*n)jie[i]=jie[i-1]*i%mo;    ni[0]=ni[1]=1;    fo(i,2,2*n)ni[i]=qsm(jie[i],mo-2);    shang=4+(n-4)*2,xia1=shang/2,xia2=shang-xia1;    fo(i,2,n){        xi=jie[shang]*ni[xia1]%mo*ni[xia2]%mo;        ans=(ans+xi*l[i]%mo*cia[n-i]%mo*cib[n-1]%mo)%mo;        shang--,xia1--;xia2=shang-xia1;    }    shang=4+(n-4)*2,xia1=shang/2,xia2=shang-xia1;    fo(i,2,n){        xi=jie[shang]*ni[xia1]%mo*ni[xia2]%mo;        ans=(ans+xi*t[i]%mo*cib[n-i]%mo*cia[n-1]%mo)%mo;        shang--,xia1--;xia2=shang-xia1;    }    printf("%lld\n",ans);}
1 0