题解

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#define ll long long
using namespace std;
const int MOD = 1e9 + 9, MAXN = 100005;
int T, n, num[MAXN], head[MAXN], nume, id[MAXN], hav[MAXN];
ll fac[MAXN], ni[MAXN];
struct edge{int to, nxt;
}e[MAXN<<1];
void adde(int from, int to) {e[++nume].to = to;e[nume].nxt = head[from];head[from] = nume;
}
ll quick_mod(ll a, ll k) {if(!a) return 0ll;if(k <= 0) return 1ll;ll ans = 1;while(k) {if(k & 1ll) (ans *= a) %= MOD;(a *= a) %= MOD;k >>= 1;}return ans % MOD;
}
void dfs(int u, int cur) {id[u] = cur;for(int i = head[u]; i; i = e[i].nxt) {int v = e[i].to;if(!id[v]) dfs(v, cur);}
}
int main() {cin >> T;fac[0] = 1;for(int i = 1; i <= 100000; i++) fac[i] = fac[i - 1] * i % MOD;ni[100000] = quick_mod(fac[100000], MOD - 2);for(int i = 100000 - 1; i >= 0; i--) (ni[i] = ni[i + 1] * (i + 1)) %= MOD;while(T--) {cin >> n;memset(head, 0, sizeof(head));memset(id, 0, sizeof(id));memset(hav, 0, sizeof(hav));nume = 0;for(int i = 1; i <= n; i++) scanf("%d", &num[i]), adde(i, num[i]);int cnt = 0;for(int i = 1; i <= n; i++) if(!id[i]) dfs(i, ++cnt);for(int i = 1; i <= n; i++) hav[id[i]]++;ll ans = 1ll;for(int i = 1; i <= cnt; i++) (ans *= quick_mod(hav[i], hav[i] - 2)) %= MOD;(ans *= fac[n - cnt]) %= MOD;for(int i = 1; i <= cnt; i++) (ans *= ni[hav[i] - 1]) %= MOD;printf("%lld\n", ans);}return 0;
}

转载于:https://www.cnblogs.com/Mr-WolframsMgcBox/p/8630270.html

LFYZOJ 104 Counting Swaps相关推荐

  1. Counting swaps

    Counting swaps 给你一个1-n的排列,问用最少的交换次数使之变为递增排列的方案数\(mod\ 10^9+7\),1 ≤ n ≤ 10^5. 解 显然最少的交换次数不定,还得需要找到最小交 ...

  2. 数数题(计数类 DP)做题记录

    数数题(计数类 DP)做题记录 CF1657E Star MST 我们称张无向完全图是美丽的当且仅当:所有和 \(1\) 相连的边的边权之和等于这张完全图的最小生成树的边权之和. 完全图点数为 \(n ...

  3. Java集合---Arrays类源码解析

    一.Arrays.sort()数组排序 Java Arrays中提供了对所有类型的排序.其中主要分为Primitive(8种基本类型)和Object两大类. 基本类型:采用调优的快速排序: 对象类型: ...

  4. 《算法竞赛进阶指南》数论篇(3)-组合计数,Lucas定理,Catalan数列,容斥原理,莫比乌斯反演,概率与数学期望,博弈论之SG函数

    文章目录 组合计数 例题:Counting swaps Lucas定理 Cnm≡Cnmodpmmodp∗Cn/pm/p(modp)C_n^m\equiv C_{n\ mod\ p}^{m\ mod\ ...

  5. 《Counting Out Time: Class Agnostic Video Repetition Counting in the Wild》论文笔记

    Counting Out Time: Class Agnostic Video Repetition Counting in the Wild Abstract 我们提出了一种估计视频中重复动作周期的 ...

  6. 零起点学算法104——第几天?

    零起点学算法104--第几天? Time Limit: 1 Sec  Memory Limit: 128 MB   64bit IO Format: %lld Description 给定一个日期,输 ...

  7. DFS:深入优先搜索 POJ-2386 Lake Counting

    深度优先搜索是从最开始的状态出发,遍历所有可以到达的状态. 因此可以对所有的状态进行操作,或列举出所有的状态. Lake Counting POJ - 2386 Due to recent rains ...

  8. Boring counting HDU - 3518 (后缀数组)

    Boring counting \[ Time Limit: 1000 ms \quad Memory Limit: 32768 kB \] 题意 给出一个字符串,求出其中出现两次及以上的子串个数,要 ...

  9. pat1004. Counting Leaves (30)

    1004. Counting Leaves (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A fam ...

最新文章

  1. ​不唯SCI,博士生要怎么培养?当我们反对SCI至上时,我们到底在反对什么?...
  2. 亚马逊用算法解雇员工:“没想到我的HR居然不是人”
  3. asp.net MVC控制器中返回JSON格式的数据时提示下载
  4. What Every Computer Programmer Should Know About Windows API, CRT, and the Standard C++ Library
  5. eclipse android 分包,eclipse中multidex的使用
  6. 居然之家完成35亿定增 小米、阿里等认购
  7. 安卓动画全解:补间动画(视图动画)、布局动画、属性动画、逐帧动画。动画Animation属性、Alpha属性、Scale属性、Translate属性、Rotate属性,动画集AnimationSet
  8. bartlett方差齐性检验_数据总体分布检验
  9. 每日算法系列【LeetCode 1004】最大连续1的个数 III
  10. Apizza在线接口调试文档工具如何方便的设置线上线下环境变量
  11. 第五章:软件详细设计
  12. kpi绩效考核流程图_某集团公司完整KPI绩效考核方案(PPT)
  13. 打造家庭影音网络:Gen8魔改ITX实现Esxi虚拟NAS+Openwrt+Win10
  14. Java毕设项目晨光文具店进销存系统设计与开发计算机(附源码+系统+数据库+LW)
  15. 新中产人群生活态度及网络理财安全行为研究报告
  16. 基于微信小程序食谱大全系统(微信小程序毕业设计)
  17. 拖延症究竟是个什么东西?
  18. 《C陷阱与缺陷》——第三章(语义陷阱)
  19. PIL Image生成与读取伪彩色图像
  20. 新书隆重推介:网络协议本质论(2011年8月面世,沤心沥血之作)

热门文章

  1. 智乃的树旋转(easy version)(思维+暴力)
  2. AcWing 837. 连通块中点的数量
  3. java txt 二维数组_java 将一个二维数组存到txt文件里,然后再读取
  4. Flink开发需要的环境
  5. Shell脚本编程之(六)循环
  6. 笔记︱精准营销解决方案以及营销组合评估
  7. R语言︱机器学习模型评价指标+(转)模型出错的四大原因及如何纠错
  8. CSS进阶(4)—— 温和padding中的诡异CSS现象
  9. 智能交通助力城市道路行车提速15%
  10. 数组的属性、foreach遍历、交错数组与矩形数组的区别