int n, to[MAXN], in[MAXN], step1[MAXN], step2[MAXN], vis[MAXN]; LL k, len1, len2;
voidtoposort(){ queue<int> q; for (int i = 1; i <= n; i++) if (!in[i]) q.push(i); while (!q.empty()) { int cur = q.front(); q.pop(); if(!(--in[to[cur]])) q.push(to[cur]); } }
voidgetLen(int cur){ if (vis[cur]) return; vis[cur] = 1; if (in[cur]) step2[++len2] = to[cur], getLen(to[cur]); else step1[++len1] = to[cur], getLen(to[cur]); }
intmain(){ std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); cin >> n >> k; for (int i = 1; i <= n; i++) cin >> to[i], in[to[i]]++; toposort(), getLen(1); if (k <= len1) cout << step1[k] << endl; else { k = (k - len1) % len2 ? (k - len1) % len2 : len2; cout << step2[k] << endl; } return0; }
E Colorful Blocks
Description
有排列于一行的 N 个格子,每个格子染上颜色 1 到 M,求至多有 K 对颜色相同的相邻格子的染色方案数。
Solution
K 对相邻颜色相同,则相邻颜色相同的一对格子缩成一个格子,则有 N−K 个格子颜色互不相同,其中一个格子颜色有 M 种取法,其它格子只有 M−1 种。
inlinevoidInit(){ fac[0] = 1; for (LL i = 1; i < MAXN; i++) fac[i] = fac[i - 1] * i % Mod; }
inline LL qpow(LL a, LL b){ // a^b LL res = 1; while (b) { if (b & 1) res = res * a % Mod; a = a * a % Mod; b >>= 1; } return res; }
inline LL C(LL N, LL M){ if (M > N || M < 0) return0; return fac[N] * qpow(fac[M], Mod - 2) % Mod * qpow(fac[N - M], Mod - 2) % Mod; }
intmain(){ ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); cin >> n >> m >> k; Init(); for (LL i = 0 ; i <= k; i++) ans = (ans + C(n - 1, i) * m % Mod * qpow(m - 1, n - i - 1) % Mod) % Mod; cout << ans << endl; return0; }