ZS the Coder and Chris the Baboon has explored Udayland for quite some time. They realize that it consists of n towns numbered from 1 to n.

There are n directed roads in the Udayland. i-th of them goes from town i to some other town ai (ai ≠ i). ZS the Coder can flip the direction of any road in Udayland, i.e. if it goes from town A to town B before the flip, it will go from town B to town A after.

ZS the Coder considers the roads in the Udayland confusing, if there is a sequence of distinct towns A1, A2, ..., Ak (k > 1) such that for every 1 ≤ i < k there is a road from town Ai to town Ai + 1 and another road from town Ak to town A1. In other words, the roads are confusing if some of them form a directed cycle of some towns.

Now ZS the Coder wonders how many sets of roads (there are 2n variants) in initial configuration can he choose to flip such that after flipping each road in the set exactly once, the resulting network will not be confusing.

Note that it is allowed that after the flipping there are more than one directed road from some town and possibly some towns with no roads leading out of it, or multiple roads between any pair of cities.

Input
The first line of the input contains single integer n (2 ≤ n ≤ 2·105) — the number of towns in Udayland.

The next line contains n integers a1, a2, ..., an (1 ≤ ai ≤ n, ai ≠ i), ai denotes a road going from town i to town ai.

Output
Print a single integer — the number of ways to flip some set of the roads so that the resulting whole set of all roads is not confusing. Since this number may be too large, print the answer modulo 109 + 7.

Examples
Input
3
2 3 1
Output
6
Input
4
2 1 1 1
Output
8
Input
5
2 4 2 5 3
Output
28
Note
Consider the first sample case. There are 3 towns and 3 roads. The towns are numbered from 1 to 3 and the roads are , , initially. Number the roads 1 to 3 in this order.

The sets of roads that ZS the Coder can flip (to make them not confusing) are {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}. Note that the empty set is invalid because if no roads are flipped, then towns 1, 2, 3 is form a directed cycle, so it is confusing. Similarly, flipping all roads is confusing too. Thus, there are a total of 6 possible sets ZS the Coder can flip.

The sample image shows all possible ways of orienting the roads from the first sample such that the network is not confusing.

题意:

思路:

细节见代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define rt return
#define dll(x) scanf("%I64d",&x)
#define xll(x) printf("%I64d\n",x)
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll powmod(ll a,ll b,ll MOD){ll ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}
inline void getInt(int* p);
const int maxn=1000010;
const int inf=0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
std::vector<int> son[maxn];
int n;
int depth[maxn];
bool vis[maxn];
ll num=0ll;
int flag=1;
void dfs(int id,int pre,int step)
{vis[id]=1;depth[id]=step;for(auto x:son[id]){if(x!=pre){if(vis[x]&&flag){num=depth[id]-depth[x]+1ll;flag=0;}if(!vis[x])dfs(x,id,step+1);}if(x==pre){pre=-1;}}
}
const ll mod=1e9+7;
int far[maxn];
int main()
{//freopen("D:\\common_text\\code_stream\\in.txt","r",stdin);//freopen("D:\\common_text\\code_stream\\out.txt","w",stdout);gbtb;cin>>n;int x;repd(i,1,n){cin>>x;son[x].pb(i);son[i].pb(x);}ll temp=n;ll ans=1ll;repd(i,1,n){if(!vis[i]){flag=1;dfs(i,-1,0);temp-=num;ans=(ans*((powmod(2ll,num,mod)-2ll+mod)%mod))%mod;}}ans=(ans*(powmod(2ll,temp,mod)))%mod;cout<<ans<<endl;return 0;
}inline void getInt(int* p) {char ch;do {ch = getchar();} while (ch == ' ' || ch == '\n');if (ch == '-') {*p = -(getchar() - '0');while ((ch = getchar()) >= '0' && ch <= '9') {*p = *p * 10 - ch + '0';}}else {*p = ch - '0';while ((ch = getchar()) >= '0' && ch <= '9') {*p = *p * 10 + ch - '0';}}
}

转载于:https://www.cnblogs.com/qieqiemin/p/11257137.html

Directed Roads CodeForces - 711D (基环外向树 )相关推荐

  1. 洛谷 2921 记忆化搜索 tarjan 基环外向树

    洛谷 2921 记忆化搜索 tarjan 传送门 (https://www.luogu.org/problem/show?pid=2921) 做这题的经历有点玄学,,起因是某个random题的同学突然 ...

  2. 【BZOJ1040】【codevs1423】骑士,第一次的基环外向树DP

    传送门1 传送门2 思路: 好题 比较简单的DP思路 之前没写过基环树DP,第一次搞真心orz 我们发现这些元素是具有从属关系的 也就是说如果对"厌恶的骑士"两两相互连边,那么问题 ...

  3. CodeForces #369 div2 D Directed Roads DFS

    题目链接:D Directed Roads 题意:给出n个点和n条边,n条边一定都是从1~n点出发的有向边.这个图被认为是有环的,现在问你有多少个边的set,满足对这个set里的所有边恰好反转一次(方 ...

  4. Codeforces 786B Legacy (线段树优化建图)

    Codeforces 786B Legacy (线段树优化建图) 题意:\(n\)个点,有\(3\)种连边操作:1.将\(u\)指向\(v\):2.将\(v\)指向编号在区间\([l,r]\)的点:3 ...

  5. Sereja and Brackets CodeForces - 380C (线段树+分治思路)

    Sereja and Brackets 题目链接: CodeForces - 380C Sereja has a bracket sequence s1, s2, ..., *s**n, or, in ...

  6. Last Theorem CodeForces - 1325F(dfs树找最大环+思维)

    It's the year 5555. You have a graph, and you want to find a long cycle and a huge independent set, ...

  7. Two Paths CodeForces - 14D(暴力+树的直径)

    As you know, Bob's brother lives in Flatland. In Flatland there are n cities, connected by n - 1 two ...

  8. 【POJ - 2631 】Roads in the North(树的直径)

    题干: Building and maintaining roads among communities in the far North is an expensive business. With ...

  9. CodeForces - 787D - Legacy(线段树优化建图+最短路)

    题目链接:点击查看 题目大意:给出 nnn 个点和 mmm 条边,现在需要求从 ststst 开始到所有点的最短路是多少,mmm 条边的给出方式如下: 1uvw1 \ u \ v \ w1 u v w ...

最新文章

  1. R语言ggplot2可视化:使用pracma包的interp1函数对缺失值进行线性插值后进行可视化分析、用虚线标记进行数据填充的区域
  2. Cache系列:spring-cache简单三步快速应用ehcache3.x-jcache缓存(spring4.x)
  3. 第五章--预处理理论
  4. LINK : fatal error LNK1168: cannot open Debug/Test.exe for writing
  5. Win10解决无法访问其他机器共享的问题
  6. 这个Python库助你发现网络图的社区结构
  7. 剑网三虽然是游戏,但场面堪比电影大片,发布会会带来什么惊喜?
  8. 读《程序是怎样跑起来》第五章有感
  9. 计算机python技术基础知识点_python基础--相关计算机基础知识
  10. 主成分分析碎石图_ISLR读书笔记十九:主成分分析(PCA)
  11. Python基础----元组
  12. [python]No module named ‘bs4‘
  13. 入住博客园,小庆一下
  14. php课后答案 唐四薪_php课后习题及答案
  15. FAT32 文件系统 实践
  16. 农夫山泉溜到了下坡路
  17. IdentityHashMap 源代码
  18. Python学习 之 tenacity重试模块
  19. 基于web在线购物商城网站的设计与实现(学生网页设计作业源码)
  20. Vert.x开发指南

热门文章

  1. SAP云平台与企业数字型转型
  2. SAP CRM one order三层内存模型
  3. oracle util_mail,在oracle 10g中发送电子邮件
  4. 反转链表 IIPython解法
  5. 认识python编程环境_认识Python和安装Python环境
  6. python目录下的文件夹_Python列出当前文件夹下文件的两种方法
  7. 公众号 采集 java_Java实现公众号数据的抓取
  8. pygame为游戏添加背景_万能的Python和Pygame模块构建一个游戏框架
  9. Matlab传递函数的几种生成方式
  10. python绘制立体扇形_Python实现PS滤镜特效之扇形变换效果示例