代码如下:
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int M=998244353;
int n,tmp[300005],s[300005][2],jc[300005],z=1;
long long sum1=1,sum2=1,sum3=1,ans;
void pls()
{
jc[0]=1,jc[1]=1;
for(int i=2;i<=n;i++)
{
jc[i]=(1ll*jc[i-1]*i)%M;
}
return;
}
bool cmp(int a,int b)
{
if(s[a][0]==s[b][0])return s[a][1]<s[b][1];
return s[a][0]<s[b][0];
}
int main()
{
scanf("%d",&n);
pls();
for(int i=1;i<=n;i++)
{
scanf("%d%d",&s[i][0],&s[i][1]);
++tmp[s[i][0]];
}
for(int i=1;i<=n;i++)
{
if(tmp[i])sum1=sum1*jc[tmp[i]]%M;
}
memset(tmp,0,sizeof(tmp));
for(int i=1;i<=n;i++)
{
++tmp[s[i][1]];
}
for(int i=1;i<=n;i++)
{
if(tmp[i])sum2=sum2*jc[tmp[i]]%M;
}
sort(s+1,s+n+1,cmp);
for(int i=2;i<=n;i++)
{
if(s[i][1]<s[i-1][1])
{
sum3=0;
break;
}
if(s[i][0]==s[i-1][0]&&s[i][1]==s[i-1][1])z++;
else
{
sum3=sum3*jc[z]%M;
z=1;
}
}
sum3=sum3*jc[z]%M;
long long ans=jc[n]-sum1-sum2+sum3;
while(ans<0)ans+=M;
printf("%lld",ans);
return 0;
}
洛谷IDE反复CE求调