zoukankan      html  css  js  c++  java
  • matrix

    matrix

    题目描述

     

    小z 的女朋友送给小z 一个n×nn×n的矩阵。但是矩阵实在太大了,小z 的女朋友拿不动,只能带给他两个长度为nn 的整数序列l,tl,t,分别作为矩阵FF的第一行和第一列(保证l1=t1l1=t1),并且告诉小z 矩阵可以通过如下方式得到:

    Fi,j=a∗Fi,j−1+b∗Fi−1,jFi,j=a∗Fi,j−1+b∗Fi−1,j

    现在小z 猜到了系数a,ba,b,他想要计算Fn,nFn,n模109+7109+7的值。

     

    输入

     

    第一行三个整数n,a,bn,a,b。

    第二行nn个数表示tt。

    第三行nn个数表示ll。

     

    输出

     

    一行一个整数表示答案。

     

    样例输入

    <span style="color:#333333"><span style="color:#333333">4 3 5
    4 1 7 3
    4 7 4 8</span></span>

    样例输出

    <span style="color:#333333"><span style="color:#333333">59716</span></span>

    提示

     

    对于前40%40%的数据,n≤5000n≤5000;

    对于另外20%20%的数据,a=0a=0;

    对于100%100%的数据,n,a,v,li,tin,a,v,li,ti。

     

    来源

    2018年10月hnsdfz集训


    手推几个小样例可以发现

    点(x1,y1)对(x2,y2)的贡献为 

    a^(x2-x1)*b^(y2-y1)* (x1,y1,x2,y2)之间的路径条数

    (0,0)到(n,m)的路径条数为C(n+m,m)( 只往右或往下走)

    那就是组合数了

    注意数组要开2倍

    还有要取模!!

    #include<cstdio>
    #include<iostream>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #define maxn 200005
    #define ll long long
    #define mod 1000000007
    using namespace std;
    int n,x[maxn],y[maxn];
    ll a,b,ans,h[maxn],ny[maxn];
    ll work(ll t,int num){
        ll p=t,ans=1;
        while(num){
            if(num&1)ans=ans*p;
            p=p*p;p%=mod;ans%=mod;num/=2;
        }
        return ans;
    }
    ll C(int M,int N){
        ll ls=h[N]*ny[M];ls%=mod;
        ls=ls*ny[N-M];ls%=mod;
        return ls;
    }
    int main()
    {   
        cin>>n>>b>>a;
        for(int i=1;i<=n;i++)scanf("%d",&x[i]);
        for(int i=1;i<=n;i++)scanf("%d",&y[i]);
        int nn=n+n;
        h[0]=1;for(int i=1;i<=nn;i++)h[i]=(i*h[i-1])%mod;
        ny[nn]=work(h[nn],mod-2);
        for(int i=nn-1;i>=0;i--)ny[i]=(ny[i+1]*(i+1))%mod;
        ll tb=1,ta=1,now=1;
        for(int i=2;i<=n;i++)tb=(tb*b)%mod,ta=(ta*a)%mod;
        for(int i=n;i>=2;i--){
            ll tmp=x[i]*tb;tmp%=mod;
            tmp=tmp*now;tmp%=mod;
            tmp=tmp*C(n-i,n-2+n-i);tmp%=mod;
            //cout<<i<<' '<<now<<' '<<tmp<<' '<<n-i<<' '<<n-2+n-i<<endl;
            ans=ans+tmp;ans%=mod;
            now=now*a;now%=mod;
        }
        now=1;
        for(int i=n;i>=2;i--){
            ll tmp=y[i]*ta;tmp%=mod;
            tmp=tmp*now;tmp%=mod;
            tmp=tmp*C(n-i,n-2+n-i);tmp%=mod;
            ans=ans+tmp;ans%=mod;
            now=now*b;now%=mod;
        }
        cout<<ans<<endl;
        return 0;
    }
  • 相关阅读:
    Appium移动自动化测试-----(十三)appium API 之其他操作
    Appium移动自动化测试-----(十二)appium API 之 TouchAction 操作
    Appium移动自动化测试-----(十一)appium API 之键盘操作
    Appium移动自动化测试-----(十)appium API 之上下文操作
    Appium移动自动化测试-----(九) appium API 之应用操作
    Appium移动自动化测试-----(八)定位控件
    Linux ls
    Pointer's NULL And 0
    JS 实现"可读"字符串转换成"二进制的01"字符串
    Qt QT_BEGIN_NAMESPACE
  • 原文地址:https://www.cnblogs.com/liankewei/p/10358818.html
Copyright © 2011-2022 走看看