求助 WA #7
查看原帖
求助 WA #7
304534
qnqfff楼主2022/1/19 14:40
#include<bits/stdc++.h>
#define int long long
const int mod=1e9+7;
using namespace std;
inline int read(){
	char ch=getchar();int s=0,f=1;
	while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
	if(ch=='-') ch=getchar(),f=-1;
	while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
	return f*s;
}
int N,h[1000010],cnt=1,n,m,vis[1000010],cao[1000010],ans=1;
struct node{
	int u,v,nxt;
}e[1000010];
void add(int u,int v){
	e[++cnt].u=u;
	e[cnt].v=v;
	e[cnt].nxt=h[u];
	h[u]=cnt; 
}
void dfs(int now,int fa,int tot){
	if(!vis[now])
		n++;
	cao[now]=1;
	if(m)
		return ;
	if(vis[now]){
		m=tot-vis[now];
		return ;
	}
	vis[now]=tot;
	for(int i=h[now];i;i=e[i].nxt)
		if((i^1)!=fa)
			dfs(e[i].v,i,tot+1);
}
int ksm(int x,int y,int z){
	int ans=1;
	while(y){
		if(y&1){
			ans*=x;
			ans%=z;
		}
		x*=x;
		x%=z;
		y>>=1;
	}
	return ans;
}
signed main(){
	N=read();
	for(int i=1;i<=N;i++){
		int u=read();
		add(i,u);
		add(u,i);
	}
	for(int i=1;i<=N;i++)
		if(!cao[i]){
			m=0;
			n=0;
			dfs(i,0,1);
			ans*=ksm(2,n,mod)-ksm(2,n-m+1,mod);
			ans%=mod;
		}
	cout<<ans%mod;
	return 0;
}
2022/1/19 14:40
加载中...