LFYZOJ 104 Counting Swaps
2024-09-07 15:09:02
#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;
}
最新文章
- Android混淆打包
- Tomcat的相关配置
- .net学习之泛型、程序集和反射
- [IIS]IIS扫盲(一)
- ZOJ 2770火烧连营——差分约束
- 《慕客网:IOS动画案例之会跳动的登入界面(下)》学习笔记 -Sketch的使用
- python_字典
- Objective-C语言控制语句
- POJ1013Counterfeit Dollar
- idea15 如何设置代码不自动折叠
- 查看Oracle当前用户下的信息(用户,表视图,索引,表空间,同义词,存储过程函数,约束条件)
- LFM 隐语义模型
- ubuntu安装XHProf
- 基于visual Studio2013解决算法导论之020单链表
- java中三大修饰符
- C++笔记--1
- dubbo源码分析7——dubbo的配置解析_与spring的整合
- C# GDI+之Graphics类 z
- [No0000EB]C# 数组(Array)
- 《Java并发编程实战》笔记-synchronized和ReentrantLock
热门文章
- Java第11次作业:什么是继承?继承的好处?什么是覆写?super()?构造代码块?子父类初始化顺序? 抽象类能用final声明吗?final关键字声明类 方法 变量以及全局常量?抽象类的构造方法?
- sql where in字符串问题
- [vijos]P1514 天才的记忆
- PAT 乙级 1086
- Jenkins注意点
- Java AES加密解密工具 -- GUI 、在线传输文件
- FastJsonUtils工具类
- 【js】【vue】获取当前dom层
- #pragma与_Pragma(转载)
- nslookup、dig命令Linux安装包