【NOIP模拟】Matrix

Description

【NOIP模拟】Matrix_第1张图片

Solution

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

Code

#include 
#include
#include
#include
#include
#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);
}

你可能感兴趣的:(【NOIP模拟】Matrix)