【NOIP2016提高A組模擬8.17】(雅禮聯考day1)Matrix
阿新 • • 發佈:2018-05-16
Go using return 分享圖片 pac IT 出發點 img scanf
題目
分析
假設,我們從\(F_{i,2}\)出發,那麽對\(F_{n,n}\)的貢獻就是\(某個系數乘以a^{n-i}b^{n-1}r_i\);
同理,如果從\(F_{2,i}\)出發,那麽對\(F_{n,n}\)的貢獻就是\(某個系數乘以a^{n-1}b^{n-i}l_i\)。
那麽某個系數是什麽呢?
感性理解一下,就是從出發點到(n,n)的方案數\(C_{2*n-i-2}^{n-i}\)。
那麽答案就是\[\sum_{i-2}^{n}C_{2*n-i-2}^{n-i}(a^{n-1}b^{n-i}l_i+a^{n-i}b^{n-1}r_i)\]
#include <cmath> #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <queue> const long long maxlongint=2147483647; const long long mo=1000000007; const long long N=100005; using namespace std; long long l[N],r[N],a[N],b[N],jc[N*2],n,ny[N*2]; long long mi(long long x,long long y) { long long sum=1; while(y) { if(y&1) sum=sum*x%mo; x=x*x%mo; y/=2; } return sum; } int main() { scanf("%lld%lld%lld",&n,&a[1],&b[1]); for(long long i=1;i<=n;i++) scanf("%lld",&l[i]); for(long long i=1;i<=n;i++) scanf("%lld",&r[i]); jc[0]=1; for(long long i=1;i<=n*2;i++) { jc[i]=jc[i-1]*i%mo; } a[0]=b[0]=1; for(long long i=2;i<=n;i++) { a[i]=a[i-1]*a[1]%mo; b[i]=b[i-1]*b[1]%mo; } long long ans=0; for(int i=2;i<=n;i++) { int sum=jc[2*n-i-2]*mi(jc[n-i],mo-2)%mo*mi(jc[n-2],mo-2)%mo; sum=sum*(a[n-1]*b[n-i]%mo*l[i]%mo+a[n-i]*b[n-1]%mo*r[i]%mo)%mo; ans=(ans+sum)%mo; } printf("%lld\n",ans); }
【NOIP2016提高A組模擬8.17】(雅禮聯考day1)Matrix