1. 程式人生 > >CERC2015 Frightful Formula 神奇的模意義下分數

CERC2015 Frightful Formula 神奇的模意義下分數

上網查了下這道題的正解是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<cstdio>
#include<cstring>
#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;
}