萌新求助CF1207D
查看原帖
萌新求助CF1207D
553349
wangyixuan_s_father楼主2022/5/27 23:24

代码如下:

#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求调

2022/5/27 23:24
加载中...