A
给定序列 \(S\),一开始只有一个数 \(x\) ,每次操作是把每个 \(S_i\) 替换为 \(S_i\) 的所有约数(从小到大排序)
求 \(k\) 次操作后序列前 \(m\) 的位置的和。\(x,k\le 10^{12},m\le 10^7\)。
因为把每个 \(S_i\) 替换为 \(S_i\) 的所有约数后相对顺序不变,所以直接从前往后搜索,复杂度 \(O(m)\)。
B
\(q\) 次询问,每次给出 \(x\),对于所有长度为 \(n\) 的排列执行以下代码并求和。\(q\le 5e4,n\le 3e5\).
int binsearch(int P[], int L, int R, int x) {
if(L>R) return 0;
int MID = (L + R) / 2;
if(P[MID] == x || L == R) return P[MID];
if(P[MID] > x) return P[MID] + binsearch(P, L, MID - 1, x);
if(P[MID] < x) return P[MID] + binsearch(P, MID + 1, R, x);
}
我们把二分经过点的构成的树建出来。考虑枚举终点在哪,可以得出需要找 \(c_1\) 个数 \(<x\),\(c_2\) 个数 \(>x\)。
不难注意到 \((c_1,c_2)\) 只有 \(\log ^2n\) 种,我们可以预处理出来每种有多少条路径。
现在求在 \(1\sim (x-1)\) 中找 \(c_1\) 个数并求和,拆贡献,强制某数选剩下的方案数是 \(A_{x-2}^{c_1-1}\times c_1\),
所以总的贡献是 \(\frac{1}{2}x(x-1)\times A_{x-2}^{c_1-1}\times c_1\)。在 \((x+1)\sim n\) 找 \(c_2\) 个数同理。
注意在合并 \(c_1,c_2\) 总共的贡献时,需要在 \(c_1\) 这边乘上 \(A_{n-x}^{c_2}\),\(c_2\) 乘上 \(A_{x-1}^{c_1}\)。
最后再乘上不属于 \((c_1,c_2)\) 的贡献,是随便填的。
C
有序列 \(A\),如果 \(A_i\&A_j=0\),那么可以交换 \(A_i,A_j\),问最后字典序最小是多少。长度 \(\le 1e6,A_i\le 2^{20}\).
注意到若 \(A_i\) 能与 \(A_j\) 交换,\(A_j\) 能与 \(A_k\) 交换,那么 \(A_i\) 能与 \(A_k\) 交换。
所以一个连通块内的 \(A\) 都可以互相交换。不妨优化建图,\(A_i\) 向 \(A_i\) 取反的子集建双向边。
那么每个点朝其 popcount 少 \(1\) 的子集的点连单向边,最后 Tarjan 缩强连通分量。
在一个联通分量里的都可以互相交换。那么我们从前往后贪心即可。
D
在一棵树上,每个点的颜色在 \([l_u,r_u]\) 里随机,计算所有情况下,所有颜色相同的点两两距离之和的和。
\(n\le 1e5,l\le r\le 1e5\)。
点分治是其中一个做法。
考虑计算每条边的贡献,枚举颜色,这条边被计算了子树内外期望点数之积,这也是一种做法。
下面是通解。拆贡献,设 \(k_i\) 表示 \(r_i-l_i+1\),\(K=\prod k_i\).
$\sum_{c}\sum_{c\in i,j} \dfrac{K}{k_ik_j}(dep_i+dep_j-2dep_{lca(i,j)}) $.
提出 \(K\),\(=\sum_c\sum_{c\in i}\dfrac{dep_i}{k_i}\sum_{c\in j}\dfrac{1}{k_j}+\sum_c\sum_{c\in i}\dfrac{1}{k_i}\sum_{c\in j}\dfrac{dep_j}{k_j}-2\sum_c \sum _{c\in i}\dfrac{1}{k_i}\sum_{c\in j}\dfrac{1}{k_j} dep_{lca(i,j)}\).
前两部分枚举 \(c\),直接扫描线解决。第三部分存在 \(dep_{lca(i,j)}\),转化为 \(i,j\) 公共祖先个数。
所以我们在加入某个点的时候,转化为链加,链求和即可。