分析:题目非常短,看起来非常难,其实把图一画就明白了.有向图,每个点的出度都是1,那么整个图肯定是环上套链,链上的边无论怎样反向都不会形成环,环上的边也可以随便反向,但是最终不能反为同向的,总方案数减去反成同向的就是答案了.总方案数可以用乘法原理求出来.

#include <bits/stdc++.h>using namespace std;const int maxn = 100010,mod = 1e9+7;
int du[maxn],to[maxn],vis[maxn];
int n,cnt;
long long ans,qpow[maxn];int main()
{freopen("road.in","r",stdin);freopen("road.out","w",stdout);queue <int> q;scanf("%d",&n);qpow[0] = 1;for (int i = 1; i <= n; i++)qpow[i] = (qpow[i - 1] * 2) % mod;for (int i = 1; i <= n; i++){scanf("%d",&to[i]);du[to[i]]++;}for (int i = 1; i <= n; i++)if (!du[i]){q.push(i);cnt++;}while (!q.empty()){int u = q.front();vis[u] = 1;q.pop();du[to[u]]--;if (du[to[u]] == 0){cnt++;q.push(to[u]);}}ans = qpow[cnt];for(int i = 1; i <= n; i++)if (!vis[i]){cnt = 0;int x = i;while (!vis[x]){cnt++;vis[x] = 1;x = to[x];}ans = (ans * (qpow[cnt] - 2 + mod)) % mod;}printf("%lld\n",ans);return 0;
}

转载于:https://www.cnblogs.com/zbtrs/p/7650820.html

清北学堂模拟赛d5t4 套路相关推荐

  1. 清北学堂模拟赛d3t2 b

    分析:一道比较让人头疼的数学题. 先考虑怎么让分出来的三角形相似,先不考虑每个三角形的具体边长,设每个三角形的周长为li,则可知必然有一个数g = gcd{li},每一个三角形的周长都是g的倍数,这样 ...

  2. 清北学堂模拟赛d6t3 反击数

    分析:显然是一道数位dp题,不过需要一些奇怪的姿势.常规的数位dp能统计出一个区间内满足条件的数的个数,可是我们要求第k个,怎么办呢?转化为经典的二分问题,我们二分当前数的大小,看它是第几大的,就可以 ...

  3. 清北学堂模拟赛d2t4 最大值(max)

    题目描述 LYK有一本书,上面有很多有趣的OI问题.今天LYK看到了这么一道题目: 这里有一个长度为n的正整数数列ai(下标为1~n).并且有一个参数k. 你需要找两个正整数x,y,使得x+k< ...

  4. 清北学堂模拟赛d1t1 位运算1(bit)

    题目描述 LYK拥有一个十进制的数N.它赋予了N一个新的意义:将N每一位都拆开来后再加起来就是N所拥有的价值.例如数字123拥有6的价值,数字999拥有27的价值. 假设数字N的价值是K,LYK想找到 ...

  5. 清北学堂模拟赛day7 错排问题

    /* 考虑一下已经放回m本书的情况,已经有书的格子不要管他,考虑没有书的格子,不考虑错排有(n-m)!种,在逐步考虑有放回原来位置的情况,已经放出去和已经被占好的格子,不用考虑,剩下全都考虑,设t=x ...

  6. 清北学堂模拟赛d6t4 数组异或

    分析:直接O(n^3)做是只有50分的,可以加一点小小的优化,就是c[k]可以从c[k-1]得到,但是还是只有60分,从宏观意义上是不能继续优化了.对于这类涉及到位运算的性质的题目,将每个数转化成二进 ...

  7. 清北学堂模拟赛d6t2 刀塔

    分析:看到最小值最大就很显然是二分了吧,二分一下最小值,把小于它的数给删掉,然后看每个数向左边能延伸多长,往右边能延伸多长,最后统计一下有没有可行答案就可以了. #include <cstdio ...

  8. 清北学堂模拟赛d3t6 c

    分析:比较神奇的一道题.要把树变成环肯定要先变成链,然后把链给拼接成环.接下来考虑一个脑洞大开的树形dp:设f[i][0]表示i不与父节点相连的链数,f[i][1]表示i与父节点相连的链数,先考虑怎么 ...

  9. 2020清北学堂秋季营感想——Hoarfrost

    2020清北学堂秋季营感想 前言:九月三十日放假以后,就马不停蹄地开始了这一次的奥赛培训.原先参加过暑假的提高组腾飞营,当时第一场模拟赛拿了第一,便觉得CSP的题目难度不会很高,普及+/提高-左右的难 ...

最新文章

  1. Could not find the main class: org.apache.catalina.startup.Boostrap. Program will exit.
  2. C++TSL之map容器(悲伤的故事)
  3. tkinter中的canvas的边框问题
  4. C++继承中的同名成员变量处理方法
  5. java类型比较_Java数据类型的比较
  6. Oulipo HDU - 1686(哈希或KMP)匹配字符串
  7. React 折腾记 - (4) 侧边栏联动Tabs菜单-增强版(结合Mobx)
  8. pytest allure测试报告_用Pytest+Allure生成漂亮的HTML图形化测试报告
  9. PCB设计常见的有那些问题
  10. ubantu分区知识
  11. 图像处理:图像灰度化
  12. CAj格式文件打开方法
  13. JAVA金额大小写转换
  14. java猜数游戏图形界面_java 猜数字游戏 swing实现带界面
  15. 重力传感事件应用之一 手机摇一摇(摇一次得一分)
  16. The SetStack Computer UVA - 12096 集合栈计算机 set集合
  17. 计算机网络的super super easy 教程 | 基础 及 数据链路层
  18. JAVA修炼之路的开启
  19. Linux日常软件安装(FC6)
  20. Python+大数据-知行教育(一)-环境搭建 数据仓库

热门文章

  1. Struts2的简单认识
  2. CentOS 6.2下log4cplus的使用
  3. linux分区空间不足--lvm逻辑卷的实现过程
  4. const与readonly,析构函数,虚拟方法
  5. Eclipse插件开发中File和IFile的转换
  6. 2.10 第二章总结加综合问题
  7. while 小项目练习
  8. WinServer-FTP搭建
  9. npm切换到淘宝镜像
  10. 并发编程之多进程篇之四