摘要:
根据题意,需要交换的部分会形成若干个不相交的环,独立处理每个环。 每个环可以用环内的最小值去和其它元素交换,或者用全局最小值和环上最小值交换,做一遍再交换回去。 #include <cstdio> #include <cstring> const int MOD = 9973; int m, n, 阅读全文
摘要:
置换群,相邻有一定限制,那么不能用polya,只能用Burnside。 Burnside本质就是每种置换群种的每个循环要染相同的颜色。 这是个环,就有 $n$ 种置换,每种置换循环节个数为 $d = \gcd(n, i)$,长度为 $\frac{n}{d}$。 每个循环为 $x \to x + d 阅读全文
摘要:
$dp[i]$ 表示以 $i$ 物品为结尾的最小费用 $dp[i] = min(dp[j] + (j - i + \sum c_k - l)^2)$ 斜率优化一下即可。 #include <bits/stdc++.h> #define ll long long using namespace std 阅读全文
摘要:
显然有一个DP方程 $dp[i][j]$ 表示到第 $i$ 位已经末尾匹配了 $j$ 位的方案数。 暴力的话就枚举下一位放啥,看放完之后又匹配了多少。 这里可以引入一个 $f[i][j]$ 数组表示从不吉利数字当前匹配了 $i$ 位,加上一个字符能匹配 $j$ 位的方案数。 这一部分可以用kmp得到 阅读全文
摘要:
可见的直线为一下凸壳。 先按斜率和截距从小到大排序,再用单调栈判断交点的相对位置即可。 #include <bits/stdc++.h> const int N = 5e4 + 7; const double eps = 1e-7; inline int dcmp(double x) { if (f 阅读全文
摘要:
prufer序列为无根树的一种数列。长度为 $n - 2$prufer转无根树将最小编号的叶子删去,prufer序列加入其父亲。重复至树只剩下两个节点。无根树转prufer取出prufer首元素,与待选点集中最小未出现在prufer序列中的点连边,并将该点在待选点集中删去,直至待选点集剩下两个节点, 阅读全文
摘要:
$cost[i][j]$ 表示第 $i$ 天到第 $j$ 天都走同一条路线时每天的最小花费,即为 $1$ 到 $m$ 的最短路。dijkstra即可。然后 $dp[i]$ 表示到第 $i$ 天的最小花费$dp[i] = min(dp[j] + cost[j + 1][i] * (i - j) + k 阅读全文
摘要:
生成树计数。基尔霍夫矩阵为度数矩阵减去邻接矩阵。无向图生成树计数为基尔霍夫矩阵的行列式可得递推方程$ans = 3 \times f(n - 1) - 2 \times f(n - 2) - 2$$f(n) = 3 \times f(n - 1) - f(n - 2)$加上高精度即可。注意算行列式时 阅读全文
摘要:
根据题意,一种置换的排数就是循环节长度的 $\text{lcm} + 1$。 就变成把 $n$ 个数分成任意多个数,能组成的 $\text{lcm}$ 有多少种。 考虑一个数 $n = p_1 ^ {k_1} p_2 ^ {k_2} \cdots p_m ^{k_m}$ 是否能某些数的 $\text 阅读全文