为什么如下的两份几乎完全一样的代码,一个会T,另一个不会?
#include<cstdio>
#define int long long
using namespace std;
const int mod=998244353,N=1e6+5;
bool a;
int fac[2*N],inv[2*N],n,m,x,y,ans;
bool b;
int binpow(int a,int b){
int res=1;
while(b){
if(b&1)res=(res*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return res%mod;
}
int init(){
fac[0]=1;
for(int i=1;i<=200000;i++)
fac[i]=(fac[i-1]*i)%mod;
inv[200000]=binpow(fac[200000],mod-2);
for(int i=199999;i>=1;i--)
inv[i]=(inv[i+1]*(i+1))%mod;
inv[0]=1;
}
int f(int i,int j){//f[i][j]=(i+j-1)!/[(j-1)!*i!]
return ((fac[i+j-1]*inv[j-1])%mod*inv[i])%mod;
}
signed main(){
init();
scanf("%lld%lld%lld%lld",&m,&n,&x,&y);
if(x<=n&&y>n)//1~x-1,x+1~n,n+1~y-1,y+1~2*n
for(int i=1;i<=m;i++)
ans=(ans+(((f(x-1,i)*f(n-x,m-i+1)%mod)*f(2*n-y,i)%mod)*f(y-n-1,m-i+1))%mod)%mod;
else
ans=f(n,m)*f(n+x-y,m)%mod;
printf("%lld",ans);
}
#include<cstdio>
#define int long long
using namespace std;
const int mod=998244353,N=1e6+5;
bool a;
int fac[2*N],inv[2*N],n,m,x,y,ans;
bool b;
int binpow(int a,int b){
int res=1;
while(b){
if(b&1)res=(res*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return res%mod;
}
int f(int i,int j){//f[i][j]=(i+j-1)!/[(j-1)!*i!]
return ((fac[i+j-1]*inv[j-1])%mod*inv[i])%mod;
}
signed main(){
fac[0]=1;
for(int i=1;i<=200000;i++)fac[i]=(fac[i-1]*i)%mod;
inv[200000]=binpow(fac[200000],mod-2);
for(int i=199999;i>=1;i--)inv[i]=(inv[i+1]*(i+1))%mod;
inv[0]=1;
scanf("%lld%lld%lld%lld",&m,&n,&x,&y);
if(x<=n&&y>n)//1~x-1,x+1~n,n+1~y-1,y+1~2*n
for(int i=1;i<=m;i++)
ans=(ans+(((f(x-1,i)*f(n-x,m-i+1)%mod)*f(2*n-y,i)%mod)*f(y-n-1,m-i+1))%mod)%mod;
else
ans=f(n,m)*f(n+x-y,m)%mod;
printf("%lld",ans);
}