1 条题解
-
0

#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
- 上传者