1 条题解

  • 0
    @ 2026-7-4 11:36:20

    #include <cstdio>
    #include <cstdlib>
    #include <iostream>
    using namespace std;
    const int M = 100005;
    const int MOD = 1e9+7;
    #define int long long
    int read()
    {
    	int x=0,f=1;char c;
    	while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;}
    	while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();}
    	return x*f;
    }
    int n,tot,ans,f[M],a[M],b[M],c[M],vis[M],dep[M];
    struct edge{int v,next;}e[M];
    void dfs(int u)
    {
    	dep[u]=1;int ls=0;
    	for(int i=f[u];i;i=e[i].next)
    	{
    		int v=e[i].v;
    		if(vis[v]==2) continue;
    		if(ls) {puts("0");exit(0);}
    		ls=1;dfs(v);dep[u]=dep[v]+1;
    	}
    }
    signed main()
    {
    	n=read();ans=1;
    	for(int i=1;i<=n;i++)
    	{
    		a[i]=read();//i->a[i]
    		e[++tot]=edge{i,f[a[i]]},f[a[i]]=tot;//a[i]->i
    	}
    	for(int i=1;i<=n;i++) if(!dep[i])
    	{
    		int t=0,x=i,lst=1;
    		for(;!vis[x];x=a[x]) vis[x]=1;
    		for(;vis[x]==1;x=a[x]) vis[x]=2,c[++t]=x;
    		for(int j=t;j>=1;j--)
    		{
    			dfs(c[j]);
    			if(lst==1 && dep[c[j]]!=1) lst=j-t;
    		}
    		if(lst==1) {b[t]++;continue;}
    		for(int j=1;j<=t;j++) if(dep[c[j]]>1)
    		{
    			int ls=j-lst,lt=dep[c[j]]-1;
    			if(ls<lt) {puts("0");exit(0);}
    			if(ls>lt) ans=ans*2%MOD;
    			lst=j;
    		}
    	}
    	for(int i=1;i<=n;i++) if(b[i])
    	{
    		int lst=0,now=1,nxt=0;
    		for(int j=1;j<=b[i];j++)
    		{
    			nxt=((i&1)&&i!=1)?(now<<1):now;
    			nxt=(nxt+(j-1)*lst%MOD*i)%MOD;
    			lst=now;now=nxt;
    		}
    		ans=ans*now%MOD;
    	}
    	printf("%lld\n",ans);
    }
    
    
    • 1

    信息

    ID
    8762
    时间
    2000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者