求助一个很离谱的问题
查看原帖
求助一个很离谱的问题
1044843
qwer6楼主2024/10/15 19:44

为什么如下的两份几乎完全一样的代码,一个会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);
}
2024/10/15 19:44
加载中...