1 条题解
-
0
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int mod = 1e9 + 9; const int maxn = 100005; ll fac[maxn], f[maxn]; int a[maxn]; bool vis[maxn]; ll qpow(ll x, ll n) { ll res = 1; while (n) { if (n & 1) res = (res * x) % mod; n >>= 1; x = (x * x) % mod; } return res; } void init() { fac[0] = 1; for (int i = 1; i < maxn; i++) { fac[i] = fac[i - 1] * i % mod; } f[1] = 1; for (int i = 2; i < maxn; i++) { f[i] = qpow(i, i - 2); } } int main() { init(); int T; scanf("%d", &T); while (T--) { memset(vis, 0, sizeof(vis)); int n; scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); } ll ans = 1; int circle_count = 0; for (int i = 1; i <= n; i++) { if (vis[i]) continue; int cnt = 1; int j = a[i]; vis[i] = true; while (j != i) { vis[j] = true; j = a[j]; cnt++; } circle_count++; ans = ans * f[cnt] % mod; ans = ans * qpow(fac[cnt - 1], mod - 2) % mod; } ans = ans * fac[n - circle_count] % mod; printf("%lld\n", ans); } return 0; }
信息
- ID
- 123
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者