const int Maxn = 1e5 + 5;
const LL Mod = 998244353;
struct Cantor {
int n;
int c[Maxn], BIT[Maxn], Bit[Maxn];
LL order, fac[Maxn];
Cantor () { memset (Bit, 0, sizeof Bit); memset (BIT, 0, sizeof BIT); }
int lowbit (int x) { return x & -x; }
void Update (int Index, int x, int *str) {
for (int i = Index; i < Maxn; i += lowbit (i))
str[i] += x;
}
int Sum (int x, int *str) {
int res = 0;
for (int i = x; i >= 1; i -= lowbit (i))
res += str[i];
return res;
}
void MakeSet () {
fac[1] = 1;
for (int i = 1; i <= n; i++) {
fac[i] = fac[i - 1] * i;
fac[i] %= Mod;
}
}
LL Get_order () {
LL sum = 0;
for (int i = n; i >= 1; i--) {
sum += (LL)Sum (c[i], BIT) * fac[n - i];
sum %= Mod;
Update (c[i], 1, BIT);
}
order = sum;
return sum;
}
void Get_Seq () {
LL tem = order - 1;
for (int i = 1; i <= n; i++) Update (i, 1, Bit);
for (int i = 1; i <= n; i++) {
int l = 1, r = n, x = tem / fac[n - i] + 1;
tem %= fac[n - i];
while (l + 1 < r) {
int mid = l + r >> 1;
if (Sum (mid, Bit) < x)
l = mid;
else
r = mid;
}
if (Sum (l, Bit) == x) c[i] = l;
else c[i] = r;
Update (c[i], -1, Bit);
}
}
};
康托&康托逆展开
最新推荐文章于 2023-07-23 11:23:35 发布