比赛 |
2025.1.18 |
评测结果 |
AAAAAAAAAA |
题目名称 |
建设城市(民间数据) |
最终得分 |
100 |
用户昵称 |
djyqjy |
运行时间 |
0.172 s |
代码语言 |
C++ |
内存使用 |
4.42 MiB |
提交时间 |
2025-01-18 10:51:39 |
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
int f=1,num=0;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
return num*f;
}
const int N=100010,MOD=998244353;
int fac[2*N],ny[2*N];
int m,n,x,y;
int ans;
int mul;
int qpow(int a,int b=MOD-2)
{
mul=1;
while(b)
{
if(b&1) mul=mul*a%MOD;
b>>=1;
a=a*a%MOD;
}
return mul;
}
int f(int a,int b){return fac[a+b-1]*ny[b-1]%MOD*ny[a]%MOD;}
signed main()
{
freopen("noi_online2020_city.in","r",stdin);
freopen("noi_online2020_city.out","w",stdout);
m=read();n=read();x=read();y=read();if(x>y) swap(x,y);
fac[0]=fac[1]=ny[0]=ny[1]=1;for(int i=2;i<n+m;i++) fac[i]=fac[i-1]*i%MOD,ny[i]=qpow(fac[i]);
if(x<=n&&y<=n)
{
for(int i=1;i<=m;i++)
ans=(ans+f(x-1,i)*f(n-y,m-i+1)%MOD)%MOD;
ans=ans*f(n,m)%MOD;
}
else if(x>n&&y>n)
{
for(int i=1;i<=m;i++)
ans=(ans+f(x-n-1,m-i+1)*f(2*n-y,i)%MOD)%MOD;
ans=ans*f(n,m)%MOD;
}
else
{
for(int i=1;i<=m;i++)
ans=(ans+f(x-1,i)*f(n-x,m-i+1)%MOD*f(y-n-1,m-i+1)%MOD*f(2*n-y,i)%MOD)%MOD;
}
printf("%lld",ans);
return 0;
}