上网查了下这道题的正解是FFT......然而机智的xushu用待定系数法A了。。。。
f[i,j]+k=a(f[i][j-1]+k)+b(f[i-1,j]+k) 解得 k=c/(a+b-1)
于是令g[i][j]=f[i][j]+k,g[i][j]=a*g[i][j-1]+b*g[i-1][j],
之后再计算g[i][1] 和 g[1][j]对 g[n][n]的贡献,就是从g[i][1]走到g[i][2]后,再走到g[n][n]有多少条路径,直接组合数,然后向右走是乘上一个a,向下走是乘上一个b,就可以很快计算出g[n][n]了,最后f[n][n]=g[n][n]-k。哇,好机智啊。
今天问了一下xushu,关于那个模意义下的分数,是真的可以表示出来的
就是a%mod不等于(a+2/7)%mod,很神奇,以后有时间要研究一下数论。
#include
#include
#define maxl 200010
#define mod 1000003
long long n,A,B,C,ans;
long long fi[maxl],fj[maxl];
long long powa[maxl],powb[maxl],c[maxl];
void prework()
{
scanf("%lld",&n);
scanf("%lld%lld%lld",&A,&B,&C);
for(long long i=1;i<=n;i++)
scanf("%lld",&fi[i]);
for(long long i=1;i<=n;i++)
scanf("%lld",&fj[i]);
powa[0]=1;powb[0]=1;
for(long long i=1;i<=n;i++)
powa[i]=(powa[i-1]*A)%mod,
powb[i]=(powb[i-1]*B)%mod;
}
long long qp(long long a,long long b)
{
long long ans=1,cnt=a;
while(b)
{
if(b&1)
ans=(ans*cnt)%mod;
cnt=(cnt*cnt)%mod;
b>>=1;
}
return ans;
}
void mainwork()
{
if(A==0 && B==0) {ans=C;return;}
if(A==1 && B==0)
{
ans=fi[n];
for(long long i=2;i<=n;i++)
ans=(ans*A+C)%mod;
return;
}
if(A==0 && B==1)
{
ans=fj[n];
for(long long j=2;j<=n;j++)
ans=(ans*B+C)%mod;
return;
}
c[n]=1;long long zi=1,mu=1,d=1,d1,d2;
for(long long i=n-1;i>=2;i--)
{
zi=(zi*(n+d-2))%mod;mu=(mu*d)%mod;
c[i]=(zi*qp(mu,mod-2))%mod;d++;
}
for(long long i=2;i<=n;i++)
{
d1=((c[i]*powa[n-1])%mod*powb[n-i])%mod;
d2=((c[i]*powb[n-1])%mod*powa[n-i])%mod;
ans=(ans+d1*fi[i]+d2*fj[i])%mod;
ans=(ans+(((d1+d2)*C)%mod*qp(A+B-1,mod-2))%mod)%mod;
}
ans=(ans-(C*qp(A+B-1,mod-2))%mod)%mod;
ans=(ans+mod)%mod;
}
void print()
{
printf("%lld",ans);
}
int main()
{
prework();
mainwork();
print();
return 0;
}