§ Desc.
有 个二元组, 用 描述. 等概率在 中选取一个 , 执行以下操作 次:
- 取一空数组 , 令 , 然后再用 替换每个 ;
问最终 的期望值对 取模的结果;
, , is not a multiple of .
§ Sol.
令 , , 其中 , 其余为 . 则答案为 (以下均省去 不写):
进行分治处理 (以下忽略 的系数).
对于 为奇数的情况:
于是我们用 的时间解决了问题. 当然亦可以建出内向基环树.
int main()
{
ios::sync_with_stdio(0);
cin.tie(nullptr);
int n; ll k; cin >> n >> k;
const int MOD = 998244353;
using mint = modint<MOD>;
using vm = vector<mint>;
vi tmp(n), T(n); rds(T), rds(tmp);
vm A(n);
transform(allu(T), T.begin(), [&](int x) { return x-1; });
transform(allu(tmp), A.begin(), [&](ll x) { return x%MOD; });
const auto add = [&](const vm& lhs, const vm& rhs) {
vm res(n);
for (int i=0;i<n;++i) res[i] = lhs[i]+rhs[i];
return res;
};
const auto mul = [&](const vm& lhs, const vi& to) {
vm res(n);
for (int i=0;i<n;++i) res[to[i]] += lhs[i];
return res;
};
const auto trans = [&](const vi& v) {
vi res(n);
for (int i=0;i<n;++i) res[i] = v[v[i]];
return res;
};
vm res(n);
ll tmp_k = k%MOD;
A = mul(A, T);
while (k) {
if (k&1) res = add(res, A), A = mul(A, T);
A = add(A, mul(A, T));
T = trans(T);
k /= 2;
}
mint inv = 1/mint(tmp_k);
for (int i=0;i<n;++i) cout << res[i]*inv << " \n"[i == n-1];
}
/ 相处的时间 你我已命运相连 /
/ 音乐频率凋谢 默契超越一切 /
/ 已记不清有多少个深夜你独自伏案桌前 /
/ 彻夜无眠 只为让我更耀眼 /