为什么高消的时候,第二个 for 语句从 1 消到 n 就错,从 i+1 到 n ,然后最后会带一下就不会错,不知道为什么
#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;
}