康托展开
判断一个排列 P 在 P 的所有排列中的排名
void init(){
fac[0] = 1;
for(int i = 1; i < N; i ++)
fac[i] = 1ll * fac[i - 1] * i % mod;
}
//nlogn
int Cantor(vector<int> a, int n){
vector<int> tr(n + 10);
function<int(int)> lowbit = [&](int x){
return x & -x;
};
function<void(int)> add = [&](int x){
for(int i = x; i <= n; i += lowbit(i))
tr[i] ++;
};
function<int(int)> query = [&](int x){
int res = 0;
for(int i = x; i; i -= lowbit(i))
res += tr[i];
return res;
};
ll ans = 1;
for(int i = n; i >= 1; i --){
ans = (ans + 1ll * query(a[i]) * fac[n - i] % mod) % mod;
add(a[i]);
}
return ans;
}
逆康托展开
求长度为 n 的排列中,字典序第 k 大的排列
vector<int> ReCantor(ll x, int n){
x --;
vector<int> v, a;
a.push_back(0);
for(int i = 1; i <= n; i++)
v.push_back(i);
for(int i = n; i; i --){
ll r = x % fac[i - 1], t = x / fac[i - 1];
x = r;
a.push_back(v[t]);
v.erase(v.begin() + t);
}
return a;
}

EGZ定理
对于 2 n − 1 2n-1 2n−1 个整数,一定能选出 n n n 个整数,使得他们的和为 n n n 的倍数
其他
1、对于图上任意一点
u
u
u,它与其他点距离的最大值
s
s
s 一定满足:
⌈
d
(
G
)
2
⌉
≤
s
≤
d
(
G
)
\lceil \frac{d(G)}{2} \rceil \leq s \leq d(G)
⌈2d(G)⌉≤s≤d(G)
d
(
G
)
d(G)
d(G) 表示图中两点之间的最大距离

2175

被折叠的 条评论
为什么被折叠?



