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;
}
posted @ 2025-12-14 08:37  Uesugi1  阅读(2)  评论(0)    收藏  举报