P4351 [CERC2015] Frightful Formula
不考虑 \(c\) 是简单的,容易转化为格路计数,路径价值为每一步权值之积。
枚举起点 \((1,i)/(i,1),i>1\) 因为不能走到另外的第一行/第一列的元素,所以 \((1,i)\) 先走到 \((2,i)\),\((i,1)\) 先走到 \((i,2)\),\((x,y)\) 到 \((n,m)\) 所有路径价值和容易得到 \(a^{n-y}b^{n-x}{2n-x-y\choose n-x}\)。所以不管第一行第一列。
考虑 \(c\) 的影响,\((x,y)\) 的 \(c\) 会被计入所有 \((x,y)\to(n,m)\) 的路径,即 \(c{2n-x-y\choose n-x}a^{n-y}b^{n-x}\)。
所有位置 \(c\) 的贡献和为:
\[c\sum_{x=2}^n\sum_{y=2}^n{2n-x-y\choose n-x}a^{n-y}b^{n-x}
\]
考虑计数:
\[\sum_{x=2}^n\sum_{y=2}^n{2n-x-y\choose n-x}a^{n-y}b^{n-x}\\
=\sum_{x=2}^nb^{n-x}\sum_{y=2}^na^{n-y}\frac{(2n-x-y)!}{(n-x)!(n-y)!}\\
=\sum_{x=2}^n\frac{b^{n-x}}{(n-x)!}\sum_{y=2}^n\frac{a^{n-y}}{(n-y)!}(2n-x-y)!
\]
记 \(f_i\) 为 \(x+y=i\) 该式的值:
\[f_i=(2n-i)!\sum_{x=2}^n \frac{b^{n-x}}{(n-x)!} \frac{a^{n-i+x}}{(n-i+x)!}\\
\]
就是卷积形式容易做到 \(O(n\log n)\)。不过单纯推式子好像没法再向下优化了,至少我不会 /wq。
考虑组合意义,\(f_i\) 相当于走 \(i\) 步从 \((0,0)\) 出发,保证 \(x,y\le n-2\)。
\[f_i=(a+b)f_{i-1}-{i-1\choose n-2}(a^{n-1}b^{i-n+1}+a^{i-n+1}b^{n-1})
\]
就能做到 \(O(n)\) 了。
UesugiErii
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
#define mp make_pair
#define cfast ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
#define intz(x,a) memset(x,a,sizeof(x))
inline ll lowbit(ll x){return x&-x;}
#define fi first
#define se second
inline void cmx(auto &x,ll y){if(y>x)x=y;}
inline void cmn(auto &x,ll y){if(y<x)x=y;}
const int mod=1e6+3,N=4e5+5;
ll qp(ll x,int y){ll res=1;for(;y;y>>=1,x=x*x%mod)if(y&1)res=res*x%mod;return res;}
ll fac[N],ifac[N],f[N],pa[N],pb[N];
int C(int x,int y){return x<y?0:fac[x]*ifac[y]%mod*ifac[x-y]%mod;}
void UesugiErii(){
int n;ll a,b,c,ans=0;cin>>n>>a>>b>>c;
for(int i=fac[0]=1;i<=n<<1;i++)fac[i]=fac[i-1]*i%mod;
ifac[n<<1]=qp(fac[n<<1],mod-2);
for(int i=n<<1;i;i--)ifac[i-1]=ifac[i]*i%mod;
for(int i=pa[0]=1;i<=n;i++)pa[i]=pa[i-1]*a%mod;
for(int i=pb[0]=1;i<=n;i++)pb[i]=pb[i-1]*b%mod;
for(int i=f[0]=1;i<=n<<1;i++){
f[i]=f[i-1]*(a+b)%mod;
if(i-n+1>=0)(f[i]-=C(i-1,n-2)*(pa[n-1]*pb[i-n+1]%mod+pb[n-1]*pa[i-n+1]%mod)%mod)%=mod;
}
for(int i=1;i<=n<<1;i++)f[i]=(f[i]+mod)%mod;
for(int i=1,x,v=pa[n-1];i<=n;i++)
cin>>x,(i>1?(ans+=x%mod*pb[n-i]*v%mod*C(2*n-2-i,n-i)%mod)%=mod:0);
for(int i=1,x,v=pb[n-1];i<=n;i++)
cin>>x,(i>1?(ans+=x%mod*pa[n-i]*v%mod*C(2*n-2-i,n-i)%mod)%=mod:0);
for(int i=0;i<=(n<<1)-4;i++)(ans+=c*f[i]%mod)%=mod;
cout<<ans;
}
signed main(){
cfast;
int _=1;//cin>>_;
for(;_;_--)UesugiErii();
return 0;
}

浙公网安备 33010602011771号