一个问题
查看原帖
一个问题
107154
daduoli楼主2023/4/19 16:24

为什么高消的时候,第二个 forfor 语句从 11 消到 nn 就错,从 i+1i+1 到 nn ,然后最后会带一下就不会错,不知道为什么

#include<bits/stdc++.h>
#define eps 1e-9
typedef long long LL;

using namespace std;
const LL MODD=1e9+7;
const int MAXN=1510;
LL T;
LL n,m,p,k;
LL G[MAXN],inv_m,inv_m_1;
LL ksm(LL x,LL y) {
	LL res=1;
	while(y) {
		if(y&1) res=res*x%MODD;
		x=x*x%MODD;
		y/=2;
	}
	return res;
}
LL a[MAXN][MAXN];
void check() {
	for(int i=1;i<=n;++i) { //
		for(int j=1;j<=n+1;++j) //
			cout<<a[i][j]<<' ';
		cout<<endl;
	} 
}
int main () {
	scanf("%lld",&T);
	while(T--) {
		memset(a,0,sizeof(a));
		memset(G,0,sizeof(G));
		scanf("%lld%lld%lld%lld",&n,&p,&m,&k);
		if(k==0) {
			printf("-1\n");
			continue;
		}
		if(m==0) {
			if(k==1) printf("-1\n");
			else {
				LL res=0;
				while(p>0) {
					if(p<n) ++p;
					p-=k,++res;
				}
				printf("%d\n",res);
			}
			continue;
		}
		inv_m=ksm(m,MODD-2); inv_m_1=ksm(m+1,MODD-2);
		LL res=ksm(m*inv_m_1%MODD,k);
		G[0]=res;
		for(int i=1;i<=n;++i) {
			res=res*(k-i+1)%MODD*ksm(i,MODD-2)%MODD*inv_m%MODD;
			G[i]=res;
		}
		for(int i=1;i<=n;++i) { 
			a[i][i]=(a[i][i]+1+MODD)%MODD;
			a[i][n+1]=(a[i][n+1]+1+MODD)%MODD;
			if(i<n) {
				for(int j=1;j<=i+1;++j) 
					a[i][j]=(a[i][j]-G[i-j+1]*inv_m_1%MODD+MODD)%MODD;
			}
			for(int j=1;j<=i;++j) 
				if(i<n) a[i][j]=(a[i][j]-G[i-j]*m%MODD*inv_m_1%MODD+MODD)%MODD;
				else a[i][j]=(a[i][j]-G[i-j]+MODD)%MODD;
		}
		for(int i=1;i<=n;++i) { 
			LL inv_a=ksm(a[i][i],MODD-2);
			for(int j=i+1;j<=n;++j) { 
				if(i==j) continue;
				LL rat=a[j][i]*inv_a%MODD; 
				a[j][i]=0;
				a[j][i+1]=((a[j][i+1]-a[i][i+1]*rat%MODD)%MODD+MODD)%MODD;
				a[j][n+1]=((a[j][n+1]-a[i][n+1]*rat%MODD)%MODD+MODD)%MODD;
			}
		}
		for(int i=n;i>1;--i) {
			a[i-1][n+1]=(a[i-1][n+1]-a[i-1][i]*ksm(a[i][i],MODD-2)%MODD*a[i][n+1]%MODD+MODD)%MODD; //
			a[i-1][i]=0;
		}
		check();
		printf("%lld\n",a[p][n+1]*ksm(a[p][p],MODD-2)%MODD);
	}
	return 0;
} 
2023/4/19 16:24
加载中...