@AC_bee
  • 板块灌水区
  • 楼主laijingyun
  • 当前回复14
  • 已保存回复14
  • 发布时间2024/8/9 14:12
  • 上次更新2024/8/9 15:14:53
查看原帖
@AC_bee
1176947
laijingyun楼主2024/8/9 14:12
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int p=1000000007;
int n,m,x,y,q,K,a[1505],s[1505],*f,*F,*g,*G,*h,*H,sum,ans;
int f1[1505],f2[1505],g1[1505],g2[1505],h1[1505],h2[1505];
inline int qpow(int a,int b){
	int res=1;
	while(b){
		if(b&1)res=(ll)res*a%p;
		b>>=1,a=(ll)a*a%p;
	}
	return res;
}
int main(){
	scanf("%d%d%d%d%d",&n,&m,&x,&y,&K);
	q=(ll)x*qpow(y,p-2)%p;
	for(int i=0,C=1;i<=m;++i){
		if(i<=K)a[i]=(ll)C*qpow(q,i)%p*qpow(p+1-q,K-i)%p;
		else a[i]=0;
		s[i]=((i?s[i-1]:0)+a[i])%p;
		C=(ll)C*(K-i)%p*qpow(i+1,p-2)%p;
	}
	f=f1,F=f2,g=g1,G=g2,h=h1,H=h2;
	for(int j=1;j<=m;++j)f[j]=1;
	for(int i=2;i<=n;++i){
		sum=0;
		for(int j=1;j<=m;++j){
			F[j]=(ll)sum*s[m-j]%p;
			sum=(sum+(ll)f[j]*a[j-1]+(ll)h[j]*s[j-1])%p;
			H[j]=((ll)f[j]*a[j-1]%p*s[m-j]+(ll)g[j]*a[m-j]%p*s[j-1]+(ll)h[j]*s[j-1]%p*s[m-j])%p;
		}
		sum=0;
		for(int j=m;j>=1;--j){
			G[j]=(ll)sum*s[j-1]%p;
			sum=(sum+(ll)g[j]*a[m-j]+(ll)h[j]*s[m-j])%p;
		}
		swap(f,F),swap(g,G),swap(h,H);
	}
	for(int j=1;j<=m;++j)
		ans=(ans+(ll)f[j]*a[j-1]%p*s[m-j]+(ll)g[j]*a[m-j]%p*s[j-1]+(ll)h[j]*s[j-1]%p*s[m-j])%p;
	printf("%d\n",ans);
	return 0;
}

@AC_bee 大佬求解!!!

2024/8/9 14:12
加载中...