社区讨论

TLE on7 玄关

CF711DDirected Roads参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lz2ebt7i
此快照首次捕获于
2024/07/26 15:43
2 年前
此快照最后确认于
2024/07/26 16:35
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10,mod=1e9+7,inf=1e17;
int n,a[N],head[N],idx,cnt;
struct edge{
	int v,next;
}e[N*2];
void con(int u,int v){
	e[++idx].v=v;
	e[idx].next=head[u];
	head[u]=idx;
}
int ksm(int a,int b){
	int ans=1;
	while(b){
		if(b&1)ans*=a;
		a*=a;
		a%=mod;
		ans%=mod;
		b>>=1;
	}
	return ans;
}
int vis[N],nxt[N],fl;
void fr(int u,int fa){
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].v;
		if(v==fa) continue;
		if(!vis[v]){
			nxt[v]=u;
			vis[v]=1;
			fr(v,u);
		}
		else{
			if(fl) continue;
			fl=1;
			int p=u;
			while(p!=v&&p){
				cnt++;
				p=nxt[p];
			}
		}
	}
}
inline int read(){
	int w=1,z=0;
	char ch=getchar();
	while(ch<'0'||ch>'9') {
		if(ch=='-') w=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9') {
		z=z*10+ch-'0';
		ch=getchar();
	}
	return w*z;
}
signed main(){
	n=read();
	int ans=1;
	for(int i=1;i<=n;i++){
		int x=read();
		con(i,x),con(x,i);
	}	
	int sum=0;
	for(int i=1;i<=n;i++){
		if(vis[i]) continue;
		cnt=0;
		fl=0;
		fr(i,0);
		cnt++;
		ans=(ans*((ksm(2,cnt)-2+mod)%mod)%mod);
		sum+=cnt;
	}
	ans=(ans*ksm(2,n-sum))%mod;
	printf("%lld",ans);
	
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...