A
有序列 \(A\),你可进行若干次操作:选定 \(A_i,A_j\),使 \(A_i=\gcd(A_i,A_j)\),\(A_j=lcm(A_i,A_j)\)。
\(n,A_i\le 10^6\)。
把每个质因数独立开,发现无论怎么操作,每个数某质因数的次数的集合不变。
所以贪心地,从大往小放置 \(A_1\sim A_n\)。
B
无向图上,\(n\le 20\),你要随机起点走 \(d\) 步,问方案数,使得把 \(S\) 中集合的点全部经过。
\(d\le 10^9,|S|\le 7\)。
经过 \(S\) 中每个点需要记录 \(2^7\) 的状态,然而不经过 \(S\) 中的点是可以直接删点的。
所以我们容斥,钦定不经过哪些点计算方案数,矩阵快速幂。
或者另一种想法是 min-max 容斥,记 \(f_u\) 表是否经过,我们即求 \(\min_S(f_u)=1\) 的方案数。
而 \(\max_T(f_u)=1\) 的方案数只要经过其中一个点即可。
C
\(n\) 个点,有若干个白点,求生成树个数,使得所有是白点且存在相邻的点是白点的点的权值和 \(\le m\)。
\(n\le 40,A_i,m\le 1e9\).
先枚举有多少个点是白点且存在相邻的点是白点的点,即白点连成大小大于 \(1\) 连通块大小之和。
由于点是带标号的,设 \([1,k],[k+1,s],[s+1,n]\) 分别代表上述点,是白点但非上述点,非白点的区间。
设这三种点为 \(ABC\)。考虑用矩阵树定理来做,\(A\) 向 \(AC\) 建边,\(B\) 向 \(C\) 建边。
这样求出来有一个问题,也就是不保证 \([1,k]\) 中不是每个点都是上述点。
可以使用容斥原理,\(Ans_k=T_k-\sum_{i=0}^{k-1}C_k^iAns_i\).
最后因为 \(n\le 40\),不妨折半搜索,分别枚举两个集合中选了多少个,然后双指针。
D
维护一棵树,边权 01,每次修改一个边权,或查询一个点距离不超过 \(1\) 的点数。
线段树分治。现在要维护每个连通块的邻边集合,支持合并连通块。
维护树上邻边的集合只需要直到父亲集合的大小和儿子的大小和,每次修改只需更新父亲。
这个好像是非常简单,但是唐诗了。