WA求调
查看原帖
WA求调
1069533
sto_clx_orz楼主2024/7/17 18:51

RT

#include<bits/stdc++.h>
#define int long long
using namespace std;

int n,r[3001],q[3001],v[3001],f[3001],g[3001],fac[3001],inv[3001],Mod=1e9+7,now;
vector<int>Map[3001];

int dfs(int u,int lenth)
{
    if(v[u])
        return 0;
    v[u]=1;
    for(int i:Map[u])
        lenth=max(lenth,dfs(i,lenth+1));
    return lenth;
}

int Pow(int a,int b)
{
    int ans=1;
    while(b)
    {
        if(b&1)
            (ans*=a)%=Mod;
        (a*=a)%=Mod;
        b>>=1;
    }
    return ans;
}

int C(int a,int b)
{return fac[a]*inv[b]%Mod*inv[a-b]%Mod;}

signed main()
{
    cin>>n;
    fac[0]=1;
    for(int i=1;i<=n<<1;i++)
        fac[i]=fac[i-1]*i%Mod;
    inv[n<<1]=Pow(fac[n<<1],Mod-2);
    for(int i=n<<1;i>=1;i--)
        inv[i-1]=inv[i]*i%Mod;
    for(int i=1;i<=n;i++)
        cin>>r[i];
    for(int i=1;i<=n;i++)
        cin>>q[i];
    for(int i=1;i<=n;i++)
        Map[r[i]].push_back(q[i]),
        Map[q[i]].push_back(r[i]);
    f[0]=1;
    for(int i=1;i<=n;i++)
        if(!v[i])
        {
            int lenth=dfs(i,1);
            now+=lenth;
            if(lenth==1)
            {
                for(int i=n;i;i--)
                    f[i]+=f[i-1];
                continue;
            }
            for(int i=now;i;i--)
            {
                int g=0;
                for(int j=0;j<=lenth&&j<=i;j++)
                    (g+=f[i-j]*(C(2*lenth-j,j)+C(2*lenth-j-1,j-1)))%=Mod;
                f[i]=g;
            }
        }
    int ans=0;
    for(int i=0;i<=n;i++)
        (ans+=(f[i]*fac[n-i]%Mod)*(i&1?-1:1))%=Mod;
    cout<<(ans+Mod)%Mod<<"\n";
}

他甚至说我样例挂了

2024/7/17 18:51
加载中...