题解

#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;
}

最新文章

  1. Android混淆打包
  2. Tomcat的相关配置
  3. .net学习之泛型、程序集和反射
  4. [IIS]IIS扫盲(一)
  5. ZOJ 2770火烧连营——差分约束
  6. 《慕客网:IOS动画案例之会跳动的登入界面(下)》学习笔记 -Sketch的使用
  7. python_字典
  8. Objective-C语言控制语句
  9. POJ1013Counterfeit Dollar
  10. idea15 如何设置代码不自动折叠
  11. 查看Oracle当前用户下的信息(用户,表视图,索引,表空间,同义词,存储过程函数,约束条件)
  12. LFM 隐语义模型
  13. ubuntu安装XHProf
  14. 基于visual Studio2013解决算法导论之020单链表
  15. java中三大修饰符
  16. C++笔记--1
  17. dubbo源码分析7——dubbo的配置解析_与spring的整合
  18. C# GDI+之Graphics类 z
  19. [No0000EB]C# 数组(Array)
  20. 《Java并发编程实战》笔记-synchronized和ReentrantLock

热门文章

  1. Java第11次作业:什么是继承?继承的好处?什么是覆写?super()?构造代码块?子父类初始化顺序? 抽象类能用final声明吗?final关键字声明类 方法 变量以及全局常量?抽象类的构造方法?
  2. sql where in字符串问题
  3. [vijos]P1514 天才的记忆
  4. PAT 乙级 1086
  5. Jenkins注意点
  6. Java AES加密解密工具 -- GUI 、在线传输文件
  7. FastJsonUtils工具类
  8. 【js】【vue】获取当前dom层
  9. #pragma与_Pragma(转载)
  10. nslookup、dig命令Linux安装包