数学做题记录-1
数学做题记录-1
LG7481. 梦现时刻
考虑答案的式子 \(\oplus_{a=1}^{m}\oplus_{b=1}^{m}\) 其实并不可怕,因为 \(O(m^2)\) 是可以承受的复杂度,所以我们只需要较为迅速的求出所有 \(F(a,b)\) 的值就可以求解。这里我们有两种选择:求出通项公式或求出递推式。考虑到组合数拥有递推式,因此我们可以考虑求递推式:
初始值是 \(F(a,0)={n\choose a},F(0,b)=2^b\),于是我们可以在 \(O(m^2)\) 的复杂度内求解。
CF1863G. Swaps
考虑对于每个位置连接 \(i\to a_i\) 的边,然后考虑操作 \(i\) 的影响就是连接 \(i\to a_i\) 变成 \(a_i\to a_i\),\(a_i\to v\) 变成 \(i\to v\)。但这样改变图的结构我们不是很喜欢,因此我们对于操作 \(i\) 只视为对 \(i\to a_i\) 打一个标记。
连通块之间互不干扰,因此答案应该是各连通块的乘积,我们对每个连通块单独求解。现在考虑什么样的标记集合是可行的,我们可以简单推出来一些必要条件:
- 每个点不能有多于一条的入边被标记。因为操作其中一条边的时候,这个点就已经变成自环了,于是第二个操作是没有意义的,因此我们不考虑多于一条的边被标记。
- 操作的边不能成环。否则一定存在一条边使得操作它的时候,它的起点已经变成了子环,因此标记的边不能成环。
设 \(C\) 为环上的点的集合,\(\text{deg}\) 为每个点的入度,则根据上述两条性质可以简单推出答案为
然而此时的答案依旧不对,仔细思考可以发现如果在环上仅有一条边没有选择,那么操作完这些边之后,环上的所有点都会变成自环,也就是说这些点不能有其他的操作。并且不管没有选择的是哪一条边,对答案的贡献都不变,因此先将多统计的答案减掉,然后加上正确的贡献,那么答案为
建出图后找到基环树的环统计答案即可,复杂度是 \(O(n)\) 的。
CF1707D. Partial Virtual Trees
考虑 \(S_i\ne S_{i-1}\) 的条件比较讨厌,不妨直接将这个内容容斥掉。具体的,设 \(F(i)\) 为保证 \(S_i\ne S_{i-1}\) 时 \(k=i\) 的答案,\(G(i)\) 为不保证 \(S_i\ne S_{i-1}\) 时 \(k=i\) 的答案,显然有
那么可以在 \(O(n^2)\) 的复杂度内直接容斥出答案,只需要考虑如何求解 \(G(i)\) 即可。不妨设 \(f(u,k)\) 表示 \(u\) 的子树在 \(S_k\) 中还没有被删完的答案,转移可以分为两种:
- 根节点在 \(S_k\) 中依然出现,那么前面的所有点是否出现是不受根节点限制的,因此转移为 \(f(u,k)\leftarrow\prod_{v}\sum_{i=0}^{k}f(v,i)\),设 \(g(u,k)\) 表示 \(f(u,k)\) 的前缀和数组则可以做到快速转移。
- 根节点在 \(S_k\) 中未出现,假设最后一个根节点出现的位置是 \(p\),那么在 \(p\) 之后只可能存在一个子树出现,并且这个子树一定在 \(S_k\) 中存在,我们枚举这个子树,那么转移可以写作 \(f(u,k)\leftarrow\sum_vf(v,k)\sum_{p<k}\prod_{w\ne v}g(w,p)\)。后面的和式可以单独用前缀积和后缀积算出 \(\prod\) 的值,然后进行前缀和,最后就可以快速转移。
综上,转移的总复杂度是 \(O(n^2)\) 的。
LG8859. 冒泡排序
考虑对两个不同求解的内容分开计算:
-
\(\text{type}=1\)
此时要求计算排列的数量,不难贪心地看出答案即为前面有比它大的数的数的数量。考虑从大到小放数,设 \(f(i,k)\) 表示放前 \(i\) 大的数时答案为 \(k\) 的排列数。那么每一次放数要么放到开头不增加答案,要么随意放一个其他的位置增加答案,因此转移方程为
\[f(i,k)=f(i-1,k)+(i-1)f(i-1,k-1) \]可以做到 \(O(n^2)\) 求解。
-
\(\text{type}=2\)
此时要求计算圆排列的数量,可以考虑将圆排列转化成排列,那么圆排列的答案就是所有断环为链成的排列的答案的 \(\min\)。对之前的得出的排列的答案仔细观察,可以发现答案其实是总个数减去前缀最大值的个数,也就是我们断环为链总是断成前缀最大值个数最多的那个。将其转化为图论问题,就是从每个点向自己后面第一个比自己大的数连边,前缀最大值的个数就是最长链的长度。注意到 \(n\) 是没有出边的,因此整个图是一棵树,最长链的长度也就是以 \(n\) 为根时整棵树的深度。由此可以设 \(f(i,k)\) 表示 \(i\) 个点的树的深度为 \(k\) 的方案数,转移的时候合并两个子树,可以得到转移方程:
\[f(i+j,\max(d_1,d_2+1))\leftarrow {i+j-2\choose i-1}f(i,d_1)f(j,d_2) \]直接转移是 \(O(n^4)\) 的,对 \(f\) 求出前缀和 \(g\) 就可以做到 \(O(n^3)\) 转移。
CF1644F. Basis
考虑一个 naive 的想法是如果最终的序列可以通过 \(F\) 操作做出来,那么它是不重要的,因为我们只需要选择操作 \(F\) 前的序列,之后在后面随意填充就可以表示这个序列。考虑什么样的序列满足可以通过操作 \(F\) 代替,显然是所有颜色连续段长度的 \(\gcd\) 不为 \(1\) 的序列。当然,最后的连续段是不能计算的,因为它可以通过溢出来缩短。因此我们想要求解的内容就是所有不包括最后的连续段的连续段的长度的 \(\text{gcd}\) 为 \(1\) 且不同构的序列总数。考虑 \(\gcd\) 恰好为 \(1\) 较为难以计算,不妨采用莫比乌斯反演,设 \(F(i)\) 表示 \(\gcd\) 恰好为 \(i\) 的答案,\(G(i)\) 表示 \(\gcd\) 为 \(i\) 的倍数的答案,那么有
所以 \(F(1)=\sum_{d=1}^{n}\mu(d)G(d)\),考虑如何求解 \(G\)。考虑将连续的 \(d\) 个位置合并成一个,最后不足的补齐,最后共有 \(\lceil\frac{n}{d}\rceil\) 个位置,然后里面可以随意填数,但是不能重构。不能重构意味着所有数字位置的集合不同,\(G\) 操作的存在意味着我们只用关心集合是否相同,而不用关心集合对应的数字。因此相当于将 \(\lceil\frac{n}{d}\rceil\) 个位置放进一些集合中,可以用第二类斯特林数表示,即
从而答案为 \(\sum_{d=1}^{n}\mu(d)\sum_{i=2}^{\min(k,\lceil\frac{n}{d}\rceil)}{\lceil\frac{n}{d}\rceil\brace i}\),不难看出只需要求出某一行斯特林数的前缀和即可,考虑用 \(\text{NTT}\) 卷积快速实现这个内容,那么单次卷积的复杂度约为 \(O(\lceil\frac{n}{d}\rceil\log \lceil\frac{n}{d}\rceil)\),总体的复杂度约为 \(O(n\log^2n)\)。
需要注意的是当整个序列全部填充一个数时,其的 \(\gcd\) 实际上是 \(0\),所以求和的下界从 \(2\) 开始。并且只需要有任何一个序列被选择,那么这样的序列是一定可以被表示出来的。但是当 \(n=1\) 或 \(k=1\) 时,上面的式子的结果是 \(0\),此时应特判后输出 \(1\)。
CF1553I. Stairs
考虑题目给出 \(a\) 序列相当于告诉我们原排列的连续段是怎样的,我们可以简单求出所有连续段的长度 \(b\)。假设总共有 \(m\) 个连续短,我们就是要放置这 \(m\) 个连续段使得相邻的两个连续段在值域上不连续。这个内容较难维护,因此不妨考虑容斥,我们可以钦定一些连续段一定放在一起,令 \(f_{m,i}\) 表示前 \(m\) 个连续段至多在值域上有 \(i\) 个连续段的方案数,那么答案就是值域上恰好有 \(m\) 段连续段的方案数,即 \(\sum_{i=1}^{m}(-1)^{m-i}i!f_i\),\(i!\) 是表示这 \(i\) 个连续段的大小关系。
现在考虑如何求出 \(f\),考虑枚举上一个值域连续段的结尾,并且考虑这个位置所在的值域连续段整体是升序还是降序可以简单得到转移,然而注意到当当前的值域连续段长度为 \(1\) 时,升序和降序是没有区别的,因此需要特判,可以得到转移方程:
这个 dp 可以简单做到 \(O(n^2)\),考虑如何优化。设 \(F_i(x)\) 为 \(f_i\) 的生成函数,同理设 \(S_i(x)\) 为 \(f_i\) 的前缀和 \(s_i\) 的生成函数,那么转移可以写成
写成矩阵的形式就是
于是可以考虑分治 \(\text{NTT}\) 做到 \(O(n\log^2 n)\),将 \(8\) 次乘法改成多项式乘法即可,可以通过提前 \(\text{NTT}\) 做到单次合并 \(12\) 次 \(\text{NTT}\)。
CF773F. Test Data Generation
考虑转化一下条件,第一个条件等价于 \(n\) 为奇数,第二个条件等价于 \(g\) 为偶数且 \(\frac{a_n}{g}\) 是奇数。可以看出 \(g\) 一定是 \(a2^k\) 的形式且 \(a\) 是奇数,但我们实际上并不关心这个 \(g\) 具体是多少,只需要让 \(\frac{a_n}{g}\) 是奇数就可以。因为 \(\frac{a_n}{g}\) 是奇数所以 \(\frac{a_n}{2^k}\) 也是奇数,然后 \(\frac{a_n}{2^k}\) 的任何因子都是奇数,那么只需要让 \(g\) 是 \(2^k\) 的倍数即可。也就是所有的数都是 \(2^k\) 的 \([1,\lfloor\frac{\text{max}_a}{2^k}\rfloor]\) 倍并且 \(\frac{a_n}{2^k}\) 为奇数,设 \(f_{A,i}\) 表示在 \(A\) 个数中选 \(i\) 个且最后一个数为奇数的方案数,那么答案就为
考虑到 \(\frac{\max_a}{2^k}\) 的范围比较大,所以可以考虑倍增。另设 \(g_{A,i}\) 表示在 \(A\) 个数中选 \(i\) 个且最后一个数为偶数的方案数,对所有倍增需要的转移讨论:
-
\(A\) 为奇数,有转移
\[\begin{aligned}&f_{A,i}=f_{A-1,i-1}+g_{A-1,i-1}+f_{A-1,i}\\&g_{A,i}=g_{A-1,i}\end{aligned} \]因为这一位是奇数,所有无法更新 \(g\),只能更新 \(A\)。
-
设 \(A=2a\) 且 \(a\) 为奇数,有转移
\[\begin{aligned}&f_{A,i}=\sum_{j=0}^{i-1}(f_{a,j}+g_{a,j})g_{a,i-j}+f_{a,i}\\&g_{A,i}=\sum_{j=0}^{i-1}(f_{a,j}+g_{a,j})f_{a,i-j}+g_{a,i} \end{aligned} \]就是考虑前半段和后半段的选择情况,注意因为前半段的长度为奇数,所以后半段的奇偶性是反过来的。
-
设 \(A=2a\) 且 \(a\) 为偶数,有转移
\[\begin{aligned}&f_{A,i}=\sum_{j=0}^{i-1}(f_{a,j}+g_{a,j})f_{a,i-j}+f_{a,i}\\&g_{A,i}=\sum_{j=0}^{i-1}(f_{a,j}+g_{a,j})g_{a,i-j}+g_{a,i} \end{aligned} \]
考虑后两种转移可以用 \(\text{FFT}\) 优化,因为这题的模数不是 \(\text{NTT}\) 模数,所以要用 \(\text{MTT}\),但这题的模数很小又弥补了这一点,所以不用怕精度炸直接用 \(\text{FFT}\) 即可。复杂度是 \(O(\max_n\log \max_n\log \max_a)\) 的。
CF1874F. Jellyfish and OEIS
通过题目的要求,我们可以考虑容斥:枚举题目中所有所有 \(\sum\max(m_l-l+1,0)\) 个区间的子集 \(S\),求出钦定这些区间是 \([l,r]\) 的排列的方案数。那么可以简单得出容斥系数为 \((-1)^{|S|}\)。
然而现在问题依旧较难求解,考虑消除一些贡献之后再计算。注意到当区间 \([l_1,r_1][l_2,r_2]\) 均满足条件且 \(l_1<l_2<r_1<r_2\) 时,区间 \([l_1,l_2-1][l_2,r_1][r_1+1,r_2]\) 也满足条件。根据这一点我们可以构造双射:找到 \(S\) 中最靠前的 \([l_1,r_1][l_2,r_2]\) 使得他们相交但不包含,如果 \([l_1,l_2-1]\) 在集合中将其删去,否则将其加入。不难看出因为 \(l_2-1<r_1\) 且 \([l_1,r_1]\) 合法,因此 \([l_1,l_2-1]\) 依然合法。两者的贡献系数相反,贡献抵消,可以得出答案只计算区间要么包含要么相离的集合的贡献。
考虑设 \(f(l,r)\) 表示只在 \([l,r]\) 填写 \([l,r]\) 之间的数的方案数,用 \(g(r,x)\) 表示当前的 \(l\) 填到 \(r\) 有 \(x\) 格没有被 \(S\) 中的区间包含的方案数(\(S\) 中不包含 \([l,r]\))。那么 \(g\) 的转移只需要考虑每一个格子是否被包含即可得到:
对于 \(f\) 只需要考虑随意交换这 \(x\) 个空格即可,即
然后用求出的 \(f(l,r)\) 贡献给 \(g(r,0)\leftarrow g(r,0)-f(l,r)\)。注意容斥系数的问题,上面的减法都是因为添加了一个 \(S\) 中的区间导致的,于是上面的做法可以做到 \(O(n^4)\),因为常数较小所以可以通过。
ABC276Ex. Construct a Matrix
考虑到给出的是矩形内权值乘积对 \(3\) 取模的结果,那么只要矩形里面有 \(0\) 结果就是 \(0\),否则值取决于 \(2\) 的个数,如果个数是奇数,那么值为 \(2\),否则值为 \(1\)。因为值不为 \(0\) 的矩形里一个 \(0\) 也不能有,于是一个简单的判断是否有解的方法就是判断值为 \(0\) 的矩阵中是否能够放置 \(0\),这个可以用前缀和简单实现。
如果暂且有解,那么所有可以填 \(0\) 的位置对答案是没有影响的,我们不妨全部填 \(0\)。然后对于所有非 \(0\) 的位置,需要满足一些矩形内 \(2\) 的奇偶性满足要求,那么显然可以用高斯消元求解,但是此时的未知元个数是 \(O(N^2)\) 的,难以承受,考虑前缀和描述一个矩形的奇偶性,那么一个矩形只需要四个点的信息,这样未知元的个数降到了 \(O(Q)\),用 bitset
优化异或线性方程组,复杂度是 \(O(\frac{Q^3}{w}+N^2)\) 的。
注意消元的时候如果有位置在整个矩形之外那么这个位置的值一定是 \(0\),不能加入方程组中。
CF917D. Stranger Trees
考虑如果我们钦定某一些边和原树一样,那么会得到一些连通块,根据扩展 Cayley 定理,我们得知 \(m\) 个连通块的生成树方案数为 \(n^{m-2}\prod a_i\),其中 \(a_i\) 是第 \(i\) 个连通块的大小。那么我们可以考虑在 dp 的途中计算这个内容。
设 \(f(u,i,k)\) 表示 \(u\) 所在的连通块内有 \(i\) 个点,\(u\) 的子树内恰好有 \(k\) 条边和原树一样的方案数。转移的时候考虑 \(u\) 向子树内的每条边是否相同:
- 如果相同,那么 \(u\) 和 \(v\) 所在的连通块要合并,有 \(f(u,i+j,k+l+1)\leftarrow f(u,i,k)f(v,j,l)\)。
- 如果不相同,那么用容斥原理,用随意安排边减去合并连通块的方案数即为不合并连通块的方案数,也就是 \(f(u,i,k+l)\leftarrow (nj-1)f(u,i,k)f(v,j,l)\)。
注意因为这样子算完之后统计的是 \(n^{m-1}\) 和 \(\prod_{i\ne 1} a_i\),因此需要将缺失的贡献不足,直接做是 \(O(n^4)\) 的。
我们有更优的方法!考虑组合意义,只需要将 \(\prod a_i\) 看作在每个连通块内任选一个点,就可以将第二位变成 \(\{0,1\}\) 表示 \(u\) 所在的连通块内是否选择过点,这样复杂度可以降到 \(O(n^2)\),转移仿照上面的思路是可以简单得到的。空间的 \(O(n^2)\) 可以通过 vector
动态做到 \(O(n)\)。
LG7736. [NOI2021] 路径交点
发现题目要求路径没有重复点。考虑到交点的产生是终点序列 \([1,n]\) 交换邻项产生逆序对的结果,因此交点个数的奇偶性和终点逆序对的奇偶性完全相同,可以考虑直接套用 LGV 引理,算出所有起点和终点之间的路径方案,设 \(f(i,u,v)\) 表示起点为第 \(1\) 层的 \(u\) 终点为第 \(i\) 层的 \(v\) 的路径数可以在 \(O(n^3)\) 的复杂度内转移。加上行列式复杂度是 \(O(n^3)\) 的。
GYM102978A. Ascending Matrix
考虑没有 \(a_{r,c}=v\) 的限制时如何求解,考虑画出对于 \(i\in[1,k)\) 的分割线,即 \(\le i\) 和 \(>i\) 的格子之间的线,显然这些线均从左下角 \((n,0)\) 开始到右上角 \((0,m)\) 结束,只能向上或向右走,且两两之间不互相穿过(可以相交)。考虑我们可以用 LGV 引理求解不相交路径的个数,于是我们可以将 \(i\) 的分割线向下、向右分别平移 \(i-1\) 格,将起点和终点分别变成 \((n+i-1,i-1)\) 和 \((i-1,m+i-1)\)。然后可以考虑用 LGV 引理求解,注意到当终点序列存在逆序对的时候得出的路径一定有交点,因此这样做是对的,并且网格图上两点之间只能向上或向右走的方案可以用组合数简单求解。
现在考虑加入 \(a_{r,c}=v\) 的限制,这相当于要求 \((r+v-2,c+v-2)\) 这个点(下文记为 \((R,C)\))上方恰好经过 \(v-1\) 条路径,且没有任何一条路径经过这个点。限制这个要求我们可以让这个点上方的路径的权值变为 \(x\),然后将每一个位置看成 \(ax+b\) 的形式,这样只需要求出答案行列式 \(x^{v-1}\) 前的系数即为答案。我们可以通过拆路径的方法,即枚举路径经过 \((R-d,C-d)\),这些路径的贡献为 \(x\),简单容斥用总路径减去刚才求出路径和经过 \((R,C)\) 的路径,剩下的路径即为贡献为 \(1\) 的路径。然而考虑行列式中计算多项式常数较大,不妨考虑拉格朗日插值,因为最后的行列式应该是一个 \(k-1\) 次的多项式,因此带入 \(k\) 个点值后插出答案系数即可,复杂度是 \(O(nk^2+k^4)\) 的。
QOJ7612. Matrix Inverse
考虑当 \(B\) 的某一列有错误的时候,那么 \(AB\) 的对应列也是错误的,否则这一列一定全对;当 \(B\) 的某一行有错误时,\(BA\) 的某一列也是错误的,同理否则这一行一定全对。有一个经典的 trick 就是考虑随机一个行向量 \(x\),计算 \(xAB\) 的值,这样如果某一列全对,那么对应位置上的数应该和 \(x\) 对应位置上的数相等,否则大概率不相等,于是我们就可以得到 \(B\) 中的哪些列存在错误。同理随机一个列向量,计算 \(BAx\) 的值可以得出 \(B\) 中的哪些列存在错误。然而关注到 \(n\) 的范围甚至不支持我们进行一次 \(O(n^3)\) 的矩阵乘法,我们利用矩阵的结合律先计算尺寸较小的乘法可以将时间压缩到 \(O(n^2)\)。
因为错误的位置个数在 \(k\) 以内,所以求出的错误的行列个数应该也都在 \(k\) 以内。对于这些位置,利用 \(AB=I\) 解一个方程组即可。我这里的做法是对每一个错误行的所有错误列的位置求解方程组,这种写法需要注意不能恰好选未知元个数个方程,因为这样可能解出无穷解,要动态添加方程知道确定答案。因为矩阵可逆所以正确性显然,可能会被卡到 \(O(nk^3)\)。综上,整体的复杂度是 \(O(n^2+nk^3)\) 的,可以通过。
CF1747E. List Generation
Solution1
考虑这个需要求解的内容只满足单调不增是容易的,假设长度为 \(k\),只需要分别将 \(n,m\) 分别划分成 \(k-1\) 个可空的集合,方案数显然是 \({n+k-2\choose k-2}{m+k-2\choose k-2}\),但是这样做会存在两个位置同时为空,这不符合 \(a_i+b_i\ne a_{i-1}+b_{i-1}\)。我们可以考虑容斥设 \(F(k)\) 为将 \(n,m\) 分成恰好 \(k\) 个可空集合且不存在两个位置同时为空的方案,\(G(k)\) 表示分成 \(k\) 个可空集合但可以存在两个位置同时为空的方案,显然有 \(G(k)={n+k-1\choose k-1}{m+k-1\choose k-1}\),同时因为每个长度都可以在这个长度下钦定一些空位置,所以可以得到
那么计算答案即为
到这里我们可以设 \(f(i,j)=(-1)^j{i+j+1\choose j},g(i)=\sum_{j=0}^{n+m-i}f(i,j)\),我们可以推出 \(f,g\) 的递推式为f
从而有
移向后得到 \(g(i-1)=2g(i)+f(i-1,n+m-i-1)-f(i,n+m-i)\),至此,我们可以 \(O(n+m)\) 递推得出答案的值。这种方法比较巧妙,所以写了一下,然而这样做的常数比较大,所以更推荐另一种。注意组合数要预处理到 \(1.5\times10^7\)。
Solution2
考虑不要容斥,直接枚举长度 \(k\),然后可以考虑枚举 \(n\) 分成 \(l\) 个非空段,\(m\) 分成 \(r\) 个非空段,为了两个没有同时非空的段,那么 \(k-r\) 个空段一定要和 \(l\) 个非空段对应,那么答案是可以简单得出的,即
后面的求和是显然的 Vandermonde 卷积,结果为 \(m+l-1\choose k-1\),考虑交换求和顺序,得到答案为
考虑将 \(k-l\) 换成 \(t\),那么里面的和式即为
于是只需要快速求出 \(\sum_{i=0}^{m}{m\choose i}=2^m,\sum_{i=0}^{m}i{m\choose i}=m2^{m-1},\sum_{i=0}^{m}i^2{m\choose i}=m(m+1)2^{m-2}\),这些都是经典组合数恒等式。总之,后面的和式是可以 \(O(1)\) 求解的,那么可以在 \(O(n)\) 的复杂度内求解,组合数预处理到 \(1\times 10^7\) 即可。
CF1874E. Jellyfish and Hack
考虑这个题目表意比较清晰,可以直接根据要求 dp:设 \(f(u,l)\) 表示长度为 \(u\) 、需要次数为 \(l\) 的序列方案数,则枚举第一个数的大小位置可以得出转移式:
这样枚举可以做到 \(O(n^6)\) 求解,将组合数拆开,得到 \(f(n,l)=(n-1)!\sum_{i=0}^{n-1}\frac{f(i)}{i!}\frac{f(n-1-i)}{(n-1-i)!}\),可以看出是卷积的形式,可以做到 \(O(n^4\log n)\),但依旧无法通过。可以考虑将 \(f(n,l)\) 看作生成函数,即令 \(F_n(x)=\sum_{i\ge 0}f(n,i)x^i\),那么转移方程可以简单改为
这样单次 dp 的复杂度降至 \(O(n^2)\),考虑到 \(F_n(x)\) 的次数上限是 \(\frac{n(n+1)}{2}\),那么代入 \(\frac{n(n+1)}{2}+1\) 个值后求出点值,接着用拉格朗日插值可以 \(O(n^4)\) 的求出每一项前的系数,最后求出答案即可,复杂度是 \(O(n^4)\) 的,然而常数较大,需要注意卡常。
CF1874D. Jellyfish and Miku
考虑设 \(f(i)\) 表示从 \(i\) 走到 \(n\) 的期望步数,那么显然有
对第二个式子简单移项则有 \(a_{i+1}(f(i)-f(i+1))=a_i(f(i-1)-f(i))+a_i+a_{i+1}\),于是可以设 \(g(i)=f(i-1)-f(i)\),于是即 \(a_{i+1}g(i+1)=a_ig(i)+a_i+a_{i-1}\),那么 \(g\) 的通项公式则不难求出为
现在考虑要让 \(f(0)\) 最小,即让 \(g(i)\) 的和最小,也就是让 \(\sum_{i}(\frac{2\sum_{j<i}a_j}{a_i}+1)=2\sum_{i}\sum_{j<i}\frac{a_j}{a_i}+n\) 最小,只需要让 \(\sum_{i}\sum_{j<i}\frac{a_j}{a_i}\) 最小。可以设 \(\text{dp}(n,s)\) 表示前 \(n\) 项的和为 \(s\) 的最小值,转移式即
这样直接转移复杂度是 \(O(nm^2)\) 的,考虑利用邻项交换法可以得到 \(a_i\) 单调不降,因此我们要求 \(k\) 满足 \(s+k(n-i)\le m\),那么复杂度降为 \(O(m^2\log m)\)。
CF1835D. Doctor's Brown Hypothesis
考虑 \(x,y\) 要相互可以到达,因此发现 \(x,y\) 在同一个强连通分量内部,考虑对每一个强连通分量单独求解,最后答案是所有强连通分量答案简单相加。
设在强连通分量中的所有 \(m\) 个环的长度从小到大为 \(\{\text{len}_i\}\),我们的一条简单路径可以通过走很多条环来扩展,也就是说最后的路径长度其实是形如 \(k=\text{len}+\sum a_i\text{len}_i\) 的形式的,其中 \(a_i\) 为非负整数。不妨取 \(d=\gcd\{\text{len}_i\}\),那么有 \(\text{len}\equiv k\pmod d\)。通过裴蜀定理和同余最短路模型,对于任何 \(d\mid k-\text{len}\land k-\text{len}\ge (\text{len}_1-1)\text{len}_m\),我们总能找到对应的非负整数 \(a_i\),并且考虑我们可以通过走很多遍同一个环从而将对应的 \(a_i\) 变成\(\bmod d\) 意义下的结果,因此随意给出的 \(a_i\) 和实际可行路径的长度差不会超出 \(nd\)。
现在考虑如何求解这个内容,考虑构造一个 \(\{\text{dis}_i\}\) 使得对于原图的所有边 \((u,v)\) 都有 \(\text{dis}_v-\text{dis}_u\equiv 1\pmod p\),可以证明只要能够构造出这个内容,那么 \(p\mid d\)。充分性的证明就是证明所有环的长度一定是这个 \(p\) 的倍数。必要性的证明可以在强连通分量的一个外向树上的所有树边直接构造满足要求的序列,接着证明所有非树边也满足这个内容。基于上述内容,我们可以选出一个外向树进行构造,然后 \(d\) 即为对于所有边 \((u,v)\),\(\text{dis}_u-\text{dis}_v+1\) 的 \(\gcd\)。
根据构造,\(x\) 到 \(y\) 的所有简单路径的长度都一定在\(\bmod d\) 意义下和 \(\text{dis}_y-\text{dis}_x\) 同余,又因为 \(\text{len}+\sum a_i\text{len}_i< (n-1)(n+1)+n^2<n^3\le k\),因此符合条件的 \(x,y\) 只要求 \(\text{dis}_y-\text{dis}_x\equiv\text{dis}_x-\text{dis}_y\equiv k\pmod d\) 即可。不难看出这要求 \(\text{dis}_y-\text{dis}_x,k\) 在模 \(d\) 意义下均为 \(0\) 或 \(\frac{d}{2}\),求出 \(\text{dis}\) 后统计即可,复杂度是 \(O(n)\) 的,并且可以带边权,只需要将所有的 \(1\) 换成边权 \(w\) 即可。
注意强连通分量里面可能只有一个点、没有环,这时的 \(d=0\) 需要特判掉。
CF1796F. Strange Triples
首先发现即使样例都快顶满数据上限,答案却依旧不大,因此可行解其实并不多,我们可以考虑优化枚举。设 \(|n|\) 表示 \(n\) 在十进制下的位数,那么原题目可以写成
可以考虑设 \(g=\gcd(a,b),a=a'g,b=b'g\),那么可以化简上面的式子得到
考虑到右边全部有 \(a'\),不妨尝试让左边也都有 \(a'\)。注意到此时 \(\gcd(a',b')=1\),并且 \(\frac{a\times10^{|n|}+n}{ n\times 10^{|b|}+b}=\frac{a'}{b'}\),那么 \(a\times 10^{|n|}+n\) 一定是 \(a'\) 的倍数,即 \(n\) 是 \(a'\) 的倍数。设 \(n=n'a'\),于是有
由于 \(b'\) 是整数,说明 \(\frac{b(10^{|n|}-1)}{n'}\) 也是整数,也就是 \(b\) 中有一部分 \(n'\) 的因子,\(10^{|n|}-1\) 中有一部分 \(n'\) 的因子,可以考虑设 \(n'=k_1k_2,d=\frac{b}{k_1},r=\frac{10^{|n|}-1}{k_2}\),并且要求 \(k_1\) 尽可能小,也就是 \(\gcd(k_1,r)=1\)。此时 \(b'=a'\times 10^{|b|}-dr\),对两边同时取模 \(10^{|b|}\) 有
因为 \(b'\le b < 10^{|b|}\),因此可以直接用等号表示出 \(b'\)。我们考虑挑一些较小的内容枚举,比如 \(|n|,k_2,|b|,d\),因为 \(d\le b<10^5\),所以这个枚举量并不大,那么此时我们就可以确定 \(b'\) 的值,同理我们可以得知 \(a'\) 的值,现在只需要知道 \(g\) 的值,就可以顺水推舟得出 \(a,b,k_1,n\) 的值,考虑 \(g\) 的范围是容易的,因为我们有
然而这样枚举效率并不高,可以考虑 \(b=b'g=dk_1\),所以有 \(g=k_1·\frac{d}{b'}\),于是设 \(d'=\frac{d}{\gcd(d,b')}\),那么 \(g\) 是 \(d'\) 的倍数,这样枚举就可以通过了。通过神秘的复杂度分析可以得到复杂度是 \(O(200B\log B)\) 的。
CF2039F1. Shohag Loves Counting (Easy Version)
考虑什么样的序列可以满足要求,有一些序列肯定不合法。考虑每一次求 \(\gcd\) 的集合,每一次操作都相当于从集合中删除局部最小值。首先序列至少需要是一个单谷函数,不然会存在某一个时刻有多个相邻的最小值,下一次最小值只有其中一个会被删除,那么两次集合的组成是一样的,因此答案不合法。同样,序列中不能同时存在相同的数,否则会出现相同的情况。这样限制之后,我们得到求 \(\gcd\) 的集合每次会删除一个最小值,也就是假设序列从大到小分别为 \(a_1,a_2,\cdots,a_n\),那么 \(\forall i,\gcd(a_1,a_2,\cdots,a_{i+1})<\gcd(a_1,a_2,\cdots,a_{i})\)。
考虑 dp 求解这个内容,设 \(f(i,l)\) 表示当前 \(\gcd=i\) 且序列长度为 \(l\) 的方案数,那么转移从大到小枚举当前要放入的数 \(x\),有
发现 \(f(i,l)\) 对答案的贡献系数是 \(2^{l-1}\) 次方(即枚举最小值前有多少个值并考虑这些值具体是哪些),因此可以放到转移中,设 \(f(i)\) 为 \(\gcd=i\) 的序列对答案的贡献和
对这个转移可以考虑莫比乌斯反演,设 \(s(i)=\sum_{k\ge 1}f(ik)\),那么可以简单得到
用 \(\text{tmp}\) 存储新转移对每一个位置产生的新的贡献,然后贡献给 \(f,s\),答案即为 \(s(1)\),直接做是 \(O(m\log ^2 m)\) 的,弱化版已经可以通过了,考虑如何通过强化版。因为不保证 \(\sum m\) 的范围,所以我们最好能够一次性求出所有 \(m\) 的答案,这要求我们改变枚举顺序,我们可以考虑用转置原理,或者反推贡献系数的方法解决。更具体的,考虑我们转移用到的内容只有变量之间的加减和乘以常数项,因此这个做法是线性的。考虑矩阵 \(\begin{bmatrix}s_1&s_2&\cdots&s_n&f_1&f_2&\cdots&f_n&\text{tmp}_1&\text{tmp}_2&\cdots&\text{tmp}_n&1\end{bmatrix}\),初始时除了最后一项都是 \(0\),而我们的操作可以看作进行了一些初等列变换,即我们要计算
对其应用转置原理,转置后即为计算
我们用一个变量 \(\text{val}\) 维护原来的常数 \(1\),初始时令 \(s_1=1\) 并从后往前进行原操作的转置操作,最后 \(\text{val}\) 即为答案,可以做到 \(O(m\log ^2 m)\) 预处理 \(O(1)\) 查询。
CF285E. Positions in Permutations
显然直接计数并不好做,不如考虑容斥,即钦定一些位置一定是完美数。设 \(F(k)\) 表示恰好有 \(k\) 个完美数的方案数,\(G(k)\) 表示钦定有 \(k\) 个完美数的方案数。那么显然有
答案即为 \(F(m)\),现在只需要考虑如何求出 \(G\)。可以简单设 \(f(i,j,S)\) 表示前 \(i\) 个数钦定了 \(j\) 个完美数,且 \(i-1,i,i+1\) 这三个位置的钦定状态为 \(S\) 的方案数。要么不放在对应位置上,要么判断 \(i-1,i+1\) 是否可以放置当前的数即可,需要特判 \(i=1\) 或 \(i=n\) 的情况。这样可以简单做到 \(O(n^2)\) 完成求解。