专栏文章

题解:P10818 [EC Final 2020] Random Shuffle

P10818题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@mio8g6bw
此快照首次捕获于
2025/12/02 15:04
3 个月前
此快照最后确认于
2025/12/02 15:04
3 个月前
查看原文
不妨设 xx 在经过 ii 次变换后得到的数值为 fif_i,那么显然问题就是变成了给出 nn 个同余方程,第 ii 个方程的形式为 fiXi(modi)f_i\equiv X_i\pmod i,其中 XiX_i 表示第一个循环中与 ii 交换的位置。
XiX_i 是容易线性求解的,那么问题就在于 fif_i。如果是一般的问题的话,肯定是考虑把 fif_i 表示成关于 xx 的多项式函数。但是这里涉及到二进制操作,所以不太能表示成多项式函数。
同时,还是由于涉及到二进制操作,所以可以尝试用暴力的方式。用 bitset 模拟左移和右移的过程,或者不用 bitset 也没问题,就是访问每一位会稍微麻烦一点。这样就可以得到 rand() 所对应的变换矩阵,可以据此列出异或的线性方程,然后考虑直接搜索或高斯消元。
问题就在于为什么是正确的。注意到对于每个 ii 都是可以列出一个方程的,所以实际上解不出来的元只有 max{0,ωn+1}\max\{0,\omega-n+1\} 个,注意到高斯消元的复杂度是可以接受的,但是搜索由于限制了 nn 的范围,造成搜索的复杂度也不会太高,然后就没问题了。

评论

1 条评论,欢迎与作者交流。

正在加载评论...