【NOIP2016提高A组模拟8.17】Matrix

来源:互联网 发布:淘宝优站卷皮 编辑:程序博客网 时间:2024/05/08 02:47

这里写图片描述

Input

第一行n,a,b
第二行和第三行为l和t

Output

答案

Sample Input

4 3 5
4 1 7 3
4 7 4 8

Sample Output

59716

Solution

通过脑补,口服,暴力,猜想,水法等各种东西,再加上之前学过的:
从(0,0)到(n,m)的路径数为Cnn+m就可以得到公式

Ans=i=1nCni2ni2(an1bnil[i]+anibn1t[i])

然后就解决了

Code

#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#define N 101000#define ll long long#define fo(i,a,b) for(ll i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)#define mo 1000000007using namespace std;ll h[N],l[N],n,a1,b1,jc[2*N+1];ll mi(ll a,ll b){    if (b==1) return a;    if(b==0) return 1;    ll k=mi(a,b/2);    if(b%2==0) return k*k%mo;    else return k*k%mo*a%mo;}ll ny(ll a){    return (mi(a,mo-2))%mo;}ll C(ll m,ll n){    ll jy1=jc[m],jy2=(jc[n]*jc[m-n])% mo;    return (ny(jy2)*jy1)%mo;}int main(){    scanf("%lld %lld %lld",&n,&a1,&b1);    jc[0]=1;fo(i,1,N*2) jc[i]=(jc[i-1]*(ll)i)%mo;    fo(i,1,n) scanf("%lld",&l[i]);    fo(i,1,n) scanf("%lld",&h[i]);    if(n==1) {printf("%lld\n",l[1]);return 0;}    ll ans=0;    fo(i,2,n)     {        ll c=C(2*n-i-2,n-i),jy=((mi(a1,n-1)*mi(b1,n-i))%mo*l[i])%mo,jy1=((mi(a1,n-i)*mi(b1,n-1))%mo*h[i])%mo;        ans=(ans+(c*(jy+jy1)%mo)%mo)%mo;    }    printf("%lld\n",ans);}
1 0
原创粉丝点击