CF思维题做题记录-2

CF2600左右有趣的思维题做题记录-2

CF1725L. Lemper Cooking Competition

考虑最后所有炉灶的温度都非负,这相当于这个数组的前缀和数组递增。我们考虑一次操作对前缀和数组的影响(记前缀和数组为 \(S\)):\((A_{i-1},A_i,A_{i+1})\to(A_{i-1}+A_i,-A_i,A_{i+1}+A_i)\),即 \((S_{i-1},S_{i},S_{i+1})\to(S_{i-1}+A_i,S_{i}-A_i,S_{i+1})\)。然而我们注意到 \(S_{i-1}+A_i=S_i,S_{i}-A_i=S_{i-1}\),那么操作后相当于 \((S_{i},S_{i-1},S_{i+1})\),于是我们可以将一次操作刻画为选择一个 \(i(2\le i\le n-1)\) 并交换 \(S_{i-1},S_i\)

这是一个经典的问题,答案即交换次数就是原数列的逆序对个数,可以用树状数组做到 \(O(n\log n)\)。然而注意到我们没有办法交换 \(S_0,S_n\),于是需要判断 \(S_0\) 是否是最小的,\(S_n\) 是否是最大的来判断是否有解。

CF1924D. Balanced Subsequences

先特判掉 \(k>\min(n,m)\) 的 corner case,显然不存在最长平衡子序列的长度为 \(2k\),答案为 \(0\)

我们设 \(f(n,m,k)\) 表示恰有 \(n\)(\(m\)),最长平衡子序列的长度 \(\le 2k\) 的序列个数。

  1. \(k=0\),显然答案为 \(1\),此时的 \(f(n,m,k)=1=\binom{n+m}{k}\)

  2. \(k=\min(n,m)\),显然此时将所有括号随意乱排即可满足限制,则 \(f(n,m,k)=\binom{n+m}{m}=\binom{n+m}{k}\)

  3. \(k<\min(n,m)\),我们可以考虑枚举第一位是 ( 还是 )

    • 如果第一位是 (,因为 \(k<m\),所以后面显然会有多余的没有匹配的 ),这个 ) 总会和第一个 ( 匹配从而给答案 \(+1\),贡献为 \(f(n-1,m,k-1)\)
    • 如果第一位是 ),显然这一位不会有贡献,那么贡献为 \(f(n,m-1,k)\)

    于是我们又转移式 \(f(n,m,k)=f(n-1,m,k-1)+f(n,m-1,k)\),根据我们的边界条件总是可以推出来 \(f(n,m,k)=\binom{n+m}{k}\)

综上,我们总有 \(f(n,m,k)=\binom{n+m}{k}\)。于是答案为 \(f(n,m,k)-f(n,m,k-1)=\binom{n+m}{k}-\binom{n+m}{k-1}\)。预处理阶乘和阶乘逆元可以做到 \(O(1)\) 查询。

CF1682E. Unordered Swaps

考虑一个大小为 \(k\) 置换环内显然恰好交换 \(k-1\) 次,且不存在环才可能使得交换合法且次数最小,因此题目中给出的操作连边后一定形成了森林。

考虑 \(i\to p_i\),显然我们唯一合法的交换次序是依次交换 \(i\to p_i\) 简单路径上的所有边,否则都会导致 \(p_i\) 无法回到原始的位置。考虑用有向边限制这个先后关系,那么将所有的 \(i\to p_i\) 限制完之后只需要进行拓扑排序就可以得到一个合法的解。

对于一条边 \((u,v)\),如果 \(u\) 的子树内存在需要到 \(v\) 的子树的点,显然这样的点最多一个,否则肯定不合法。对于 \(v\) 的子树内的点同理,因此 \((u,v)\) 最多被两条路径覆盖,那么暴力跳父亲限制即可,复杂度是 \(O(n)\) 的。

CF1970A3. Balanced Unshuffle (Hard)

考虑简单版的正序实现,显然可以直接排序做到 \(O(n\log n)\),但是这对我们后面没有什么启发,因此不妨更进一步考虑。首先我们要知道,一个合法括号序列可以表示一个树:( 表示进入一个子树,) 表示离开一个子树,我们可以通过这个过程唯一确定一棵树的形态。考虑我们怎么用这棵树解决排序问题:显然在处理一个字符时,当前所在的位置的深度就是这个字符的前缀平衡值,因此我们将这个字符留在该节点的最前面,然后根据字符种类选择进入一个子树还是离开这个子树。最后从根节点开始广搜,将每个节点上的字符依次输出即可,复杂度可以做到 \(O(n)\)

接下来考虑反向,在刚才的过程中,我们发现除根节点外所有的点的第一个字符都是 ),且剩下的字符都是 (,并且个数等于儿子个数。这是因为每个节点在进入儿子时一定会留下一个 (,在离开时一定会留下一个 ),并且离开肯定是最后进行的。这启发我们利用这一点复原树的结构:我们采用广搜,依次扫描字符,如果字符为 (,则给当前节点增加一个儿子;否则这个节点没有儿子了,直接退出即可。确定了树的结构后,我们可以轻松确定原字符串,复杂度是 \(O(n)\) 的。

值得一提的是,题目中提到的两个证明可以通过上述过程简单证明。

CF1720D2. Xor-Subsequence (hard version)

考虑有一个显然的 dp 设计:\(f_i\) 表示以第 \(i\) 位为结尾的最长合法序列长度,那么转移方程是显然的

\[f_i=\max\limits_{a_j\oplus i<a_i\oplus j}f_j+1 \]

考虑如何快速找到所有满足条件的 \(f_j\),可以对限制拆位,对于第 \(k\) 位,可能有:

  • \(a_j\oplus i=0\)\(a_i\oplus j=1\),此时所有的 \(j\)\(f_j\) 都有贡献。
  • \(a_j\oplus i=a_i\oplus j\),此时继续向下一位讨论即可。

于是我们维护 \(a_i\oplus i\),考虑转化上面的两个条件:

  • \(a_i\oplus i=a_j\oplus j\oplus 1\land i=a_j\),此时所有的 \(j\)\(f_j\) 都有贡献。
  • \(a_i\oplus i=a_j\oplus j\),此时继续向下一位讨论即可。

不难看出可以直接用 Trie 树维护后向下走,对每一个节点维护这一位所有 \(a_i=0/1\)\(f_i\) 的最大值即可,复杂度是 \(O(n\log V)\) 的。

CF1442D. Sum

直接做背包是 \(O(nk^2)\) 的,我们考虑发现一些性质。首先可以容易得到一个结论:最多只有一个序列没有选满。可以用反证法证明:假设有两个没有选满,比较两个序列的最后选择的值,设有 \(A_{1,p}<A_{2,q}\),于是可以考虑将 \(A_{1,p}\) 取消,进而选择 \(A_{2,q+1}\),由于递增的性质,这样一定不劣。并且由于递增,取消之后的 \(A_{1,p-1}\) 依旧小于 \(A_{2,q+1}\),这样重复操作直到一者选空或选满肯定更优,这样枚举哪个数组没有选满,剩下的数组就只用进行 \(01\) 背包了,总复杂度是 \(O(n^2k)\) 的。

现在考虑一个经典的分治思路:\(\text{Solve}(l,r)\) 表示正在求解 \([l,r]\) 区间,我们先将左区间 \([l,\text{mid}]\) 的所有数组放入背包中,然后调用 \(\text{Solve}(\text{mid}+1,r)\),接着还原背包,将右区间 \([\text{mid}+1,r]\) 的所有数组放入背包中,然后调用 \(\text{Solve}(l,\text{mid})\)。这样做的好处是当处理 \([l,r]\) 时,除这个区间外的所有数组都已经被放入了背包,这样我们只需要在 \([l,l]\) 处统计答案即可,复杂度分析 \(T(n)=2T(\dfrac{n}{2})+O(nk)\) 得到时间复杂度是 \(O(nk)\) 的。

CF1545C. AquaMoon and Permutations

考虑有一些行是一定可以确定的:当 \(a_{i,j}\) 是第 \(j\) 列在唯一出现时,显然第 \(i\) 行一定要选。我们先将这些行选择了,那么和这些行的某一列相同的行肯定不能选,根据题目中保证的性质,我们至少能找到一行删去。接着我们继续寻找是否有能够确定的行直到找不到为止。

根据我们每次确定的行都会至少连带着一行删去,那么我们此时剩下的行数 \(\le\) 二倍的未确定行数。根据鸽笼原理,此时每一列的每一个数都恰好出现了两次,这说明我们可以将剩下的行分成两个拉丁方,所以我们此时可以任意选择一行,将方案数 \(\times 2\) 即可。

上面的过程都可以暴力枚举实现,复杂度是 \(O(n^3)\) 的。

CF338D. GCD Table

考虑因为要满足 \(\gcd(x,y+i-1)=a_i\) 的限制,所以显然有 \(\text{lcm}(a_1,a_2,\cdots,a_k)\mid x\)。设 \(L=\text{lcm}(a_1,a_2,\cdots,a_k)\),那么考虑到若 \(x=L\) 满足条件,则 \(x=kL(k>1)\) 时仍满足条件当且仅当 \(\gcd(k,y+i-1)=1\),这对 \(y\) 提出了更严苛的限制,因此我们取 \(x=L\) 一定最优。

现在我们构造 \(y\),因为 \(x=L\)\(\gcd(x,y+i-1)=a_i\),那么 \(a_i\mid y+i-1\),也就是说我们有

\[\begin{cases}y\equiv0&\pmod {a_1}\\y\equiv -1&\pmod{a_2}\\\vdots\\y\equiv 1-k&\pmod {a_k}\end{cases} \]

因此对于 \(y\) 来说可以用 exCRT 求出一个最小解,然而此时求出的 \(y\) 并不充分,因此我们需要再次检查所有的 \(\gcd(x,y+i-1)\) 是否符合条件。

题目中还要求 \(x\le n,y>0,y+k-1\le m\),判断后输出即可。注意特判求出 \(y\equiv 0\pmod M\) 的情况,这时 \(y\) 应取到 \(M\)

CF1889C2. Doremy's Drying Plan (Hard Version)

一个显然的想法是设 \(f_{i,c}\) 表示钦定第 \(i\) 个城市是干燥城市且前 \(i\) 个城市的钦定需要至少使用 \(c\) 次能力时,前 \(i\) 个城市中最多的干燥城市个数。转移可以枚举上一个干燥城市 \(p\),那么我们为了满足条件,需要对所有左端点在 \((p,i]\),右端点在 \([i,n]\) 的区间使用能力,用数据结构统计后转移。复杂度可以做到 \(O(n^2k\text{poly}(\log n))\)

考虑优化,不难发现我们多使用的能力次数只和右端点在 \([i,n]\) 的区间的左端点有关,而我们能使用能力的次数又极小,因此可以考虑枚举左端点的位置,这样最多枚举 \(k\) 个左端点,否则为了满足钦定,能力的使用定然会超出次数限制。设从大到小第 \(i\) 个左端点的位置为 \(p_i\),那么新使用 \(i\) 次能力的转 移端点应在 \([p_{i+1},p_i)\) 之间。用数据结构维护区间 \(\max\),那么复杂度优化到 \(O(nk^2\log n)\),很可惜无法通过。

考虑用动态 st 表优化,这样新增一个位置是 \(O(\log n)\),但查询只需要 \(O(1)\),复杂度降为 \(O(nk(k+\log n))\),可以通过。至于如何维护右端点在 \([i,n]\) 的所有左端点位置,可以用扫描线和 multiset 解决,维护的复杂度不是瓶颈。

CF1895F. Fancy Arrays

考虑 \([x,x+k)\) 这个区间不可能一次性跨过,那么原序列符合条件只需要在满足第二个条件的基础上满足 \(\min<x+k\)\(\max\ge x\) 即可。同时满足两个内容的序列较难统计,可以考虑容斥,用满足 \(\min <x+k\) 的序列数量减去 \(\max <x\) 的序列数量。

对于 \(\min<x+k\) 的序列,我们可以先忽略所有元素均为非负整数,这样通过差分数组我们可以确定序列的所有形态,而差分数组的取值是 \([-k,k]\),共有 \((2k+1)^{n-1}\) 种。此时我们可以将所有元素同时加减某一个数,使得最小值在 \([0,x+k)\) 范围内共 \(x+k\) 种情况,因此总方案数为 \((x+k)(2k+1)^{n-1}\)

对于 \(\max<x\) 的序列,由于 \(x\) 较小,不难看出可以 dp,设 \(f_{i,v}\) 表示第 \(i\) 位为 \(v\) 时前 \(i\) 位序列的方案数,不难看出可以用矩阵优化转移,这样复杂度是 \(O(x^3\log n)\) 的。

CF453D. Little Pony and Elements of Harmony

考虑对转移式有转化,记 \(c(x)\) 表示 \(x\) 二进制下 \(1\) 的个数:

\[e_i(u)=\sum e_{i-1}(v)\cdot b(c(u\oplus v)) \]

等价于

\[e_i(u\oplus v)=\sum e_{i-1}(v)\cdot b(c(u)) \]

那么这就是一个异或卷积的形式,记 \(b'(u)=b(c(u))\),考虑对 \(b'\)\(e\) 都求出 FWT,由于 FWT 是线性变换,于是有 \(\text{FWT}(e_i)=\text{FWT}(e)\cdot\text{FWT}(b')^i\),可以用快速幂快速转移,最后再做一次 IFWT。这样复杂度是 \(O((m+\log t)2^m)\)

然而考虑到 \(p\) 没有任何限制,那么 \(2\) 可能没有逆元,需要换一种方式解决。考虑到 FWT 有一种类 NTT 的实现,FWT 和 IFWT 的变换是一样的,只需要在最后统一除以 \(n\)(从位矩阵的角度看,相当于每一个数位的贡献都扩大了 \(2\) 倍,\(m\) 个数位就扩大了 \(n\) 倍)。然而 \(p\) 依然不一定有 \(n\) 的逆元。有一个经典的套路是 \(\frac{a}{n}\bmod p=\frac{a\bmod {(np)}}{n}\),于是整个过程都对 \(np\) 取模即可。

此时还有一个问题是 \(np\) 的规模是 \(10^{15}\) 的,直接乘会超过 long long 范围,因此可以考虑使用 __int128 或者是使用光速乘。

CF1827C. Palindrome Partition

\(f_i\) 表示以 \(i\) 结尾的合法串个数。考虑如果对以每个位置 \(i\) 结尾的偶回文串进行转移,那么不仅复杂度无法接受,同时计算也会出现重复,因此我们想对所有合法子串钦定唯一的划分。

考虑对于一个合法串,其可能存在多种划分方式,不妨取所有划分方式的断点的并集作为断点,不难证明这依然是一个合法的划分(因为偶回文串的某个前缀或后缀也是偶回文串的话,剩下的后缀或前缀一定可以划分成若干个偶回文串)。

那么我们发现,此时我们的划分一定会使得每一段的偶回文串都没有偶回文串后缀,也就是说这是一段最短的偶回文串后缀,我们只需要对每个 \(i\) 求出 \(p_i\) 表示以 \(i\) 结尾的最短偶回文串的起始点在 \(p_i\),就可以写出转移式:

\[f_i=f_{p_i-1}+1 \]

答案是所有位置的 \(f\) 和。考虑如何处理出 \(p_i\),先用 manacher 处理出每个对称中心的极长半径,那么因为我们想要让 \(p_i\) 最大,就是想让每个 \(i\) 能选择的对称中心尽可能大。显然每个对称中心能够更新一段区间的 \(p_i\),用栈维护当前最大的有效对称中心即可做到 \(O(n)\)

CF1804F. Approximate Diameter

考虑到对于一个固定的 \(u\),对于其他所有点 \(v\)\(\rho(u,v)\) 是可以 \(O(n)\) 求解的。考虑我们固定一个端点为 \(u\) 时图的直径 \(D_u(G)\),那么我们有

\[\lceil\frac{D(G)}{2}\rceil\le D_u(G)\le D(G) \]

这是因为我们不可能在 \(u\) 的分层图上找到两个点之间的距离 \(>2D_u(G)\),并且一定能找到两个点的距离 \(\ge D_u(G)\)。发现上面的限制和题目给出的下界较为吻合,考虑对宽松的上界带来的做法。对于两个时刻 \(a,b\),显然有 \(D_u(G_a)\ge D_u(G_b)\),若 \(D_u(G_a)\le 2D_u(B_b)\),那么有

\[\lceil\frac{D(G_b)}{2}\rceil\le D_u(G_b)\le D_u(G_a)\le 2G_u(G_b)\le 2D(G_b) \]

于是我们看出 \(D_u(G_a)\) 也是时刻 \(b\) 的一个合法输出,于是我们可以二分找到最后一个满足 \(D_u(G_a)\le 2D_u(G_b)\)\(b\)\([a,b]\) 中的答案都已经确定,而 \(b+1\) 的答案为 \(D_u(G_{b+1})<\frac{D_u(G_a)}{2}\),因而每段区间的输出至少相差 \(2\) 倍,于是我们最多有 \(O(\log n)\) 段区间。对每段区间的二分是 \(O(\log n)\) 的,单次求解需要 \(O(n)\) 计算,于是总复杂度可以做到 \(O(n\log^2n)\)

CF662C. Binary Table

看到 \(n\le 20\),一个非常自然的想法是枚举每一行是否反转,共 \(2^n\) 种情况。接着对于每一列,我们贪心的选择是否反转即可,这样的复杂度是 \(O(2^nm)\) 的。

考虑对于行反转状态为 \(u\) 最小值进行计算。考虑如果第 \(i\) 列的状态为 \(c_i\),则反转后状态会变为 \(c_i\oplus u\),而这一列是否反转是确定的。设 \(\text{pc}(x)\) 表示 \(x\) 的二进制位中 \(1\) 的个数,这一列对答案的贡献即为

\[g_{c_i\oplus u}=\min(\text{pc}(c_i\oplus u),n-\text{pc}(c_i\oplus u)) \]

假设我们初始有 \(f_{c_i}\) 个列的状态恰为 \(c_i\),那么行反转状态为 \(u\) 的答案即为

\[\text{ans}_u=\sum f_{v}g_{v\oplus u}\Rightarrow \text{ans}_{u\oplus v}=\sum f_ug_v \]

这是显然的异或卷积形式,直接使用 FWT 可以做到 \(O(n2^n)\) 的复杂度,答案对所有 \(\text{ans}\)\(\min\) 即可。

CF622F. The Sum of the k-th Powers

首先根据经典结论,我们知道答案是一个关于 \(n\)\(k+1\) 次多项式,我们不难想到使用拉格朗日插值。直接做复杂度是 \(O(k^2)\) 的,但是对于没有强制给定点的题目,我们是存在 \(O(k)\) 的做法的:更具体的,我们选择 \([1,k+2]\) 中的所有点作为特殊点,显然我们可以在 \(O(k\log k)\) 的复杂度内算出这些点的纵坐标。我们发现当 \(x\) 连续时,分母将会变为两个阶乘相乘,可以预处理阶乘逆元解决。而分子可以通过处理前缀积和后缀积解决。于是我们可以做到 \(O(k\log k)-O(k)\)

CF360D. Levko and Sets

考虑我们集合里的数一定可以写成 \(a_i^{\sum c_i\cdot b_i}\) 的形式,考虑到 \(a^{p-1}\equiv 1\pmod p\),于是我们考虑考察 \(\sum c_i\cdot b_i\bmod {p-1}\) 的值。根据裴蜀定理,我们知道若 \(d=\gcd(p-1,b_i)\),那么 \(d|(\sum c_i\cdot b_i\bmod {p-1})\)

于是集合里的数一定可以写成 \(a_i^{k_id}\) 的形式,考虑找到最小的正整数 \(k_i\) 满足 \(a_i^{k_id}\equiv 1\pmod p\),那么此时集合 \(i\) 中恰有 \(k_i\) 个数。因为 \(d\)\(p-1\) 的因数,所以 \(k_i\) 一定是 \(\frac{p-1}{d}\) 的因数,也一定是 \(p-1\) 的因数。

而在离散对数的角度下, \(a_i^{d}\) 次方应当恰能写成 \(p\) 的原根 \(g\)\(\frac{p-1}{k_i}\) 次方。将集合里的数全部改成离散对数的意义,应该是 \([1,p-1]\) 内所有 \(\frac{p-1}{k_i}\) 的倍数。所有集合的并集就应该是

\[\{x\in\mathbb{N}\mid x\in[1,p-1]\land\exist \frac{p-1}{k_i}|x\} \]

考虑如何求出这个集合的大小。首先集合里的数显然都是 \(p-1\) 的因数,考虑设 \(f_d\) 表示集合内和 \(p-1\)\(\gcd\) 恰为 \(d\) 的数的个数。如果不存在 \(\frac{p-1}{k_i}\)\(d\) 的因数,显然 \(f_d=0\)。否则考虑用 \([1,p-1]\)\(d\) 的倍数个数减去和 \(p-1\)\(\gcd\)\(d\) 的倍数的数,即

\[f_d=\frac{p-1}{d}-\sum_{d|d'}f_{d'} \]

最后答案即为 \(\sum f_d\)。设 \(D\)\(p-1\) 的约数个数,总复杂度是 \(O((n+D)D)\) 的。因为 \(D\) 最多只有 \(1344\),因此可以通过。

CF547D. Mike and Fish

考虑将每个点变成边,连接其 \(x\) 坐标和 \(y\) 坐标,这样原图就被转换成了一个二分图。考虑我们就是要对边染色,使得所有点连边红色和蓝色相差不超过 \(1\)

注意到对于一张非奇环欧拉图,或者一张半欧拉图,我们只需要按照欧拉回路或欧拉路径的顺序,轮流给每一条边染色成红色和蓝色就可以满足条件。然而此时的图不一定是满足条件的,可以考虑添加一些边使得图符合条件。不难想到将所有奇度点和 \(0\) 连边,这样所有点的度数都是偶数(因为原图一定有偶数个奇度点,因此 \(0\) 的度数也为偶数),并且由于每一个原图的点只添加了一条边,那么就算去掉这条边也依然符合答案要求。每一个连通块都应该是一张欧拉图,跑一遍欧拉回路构造即可。注意图不一定连通,需要遍历所有连通块,复杂度是 \(O(n)\) 的。

然而注意到我们添加完边后有可能会导致原图存在奇环,仔细思考我们会发现奇环中不合法的内容一定存在于起点,因此只需要让额外添加的 \(0\) 作为起点即可保证构造没有问题。由于题目保证存在解,不可能有不和 \(0\) 相连的奇环。如果要判断是否有解,需要将所有原图中的边检查一遍判断是否符合要求。

AGC030C. Coloring Torus

对于 \(k\le 500\),我们可以轻易构造:

k
1 2 3 ... k
1 2 3 ... k
1 2 3 ... k
. . . ... .
. . . ... .
. . . ... .
1 2 3 ... k

然而对于 \(k>500\) 也无法调整。考虑因为所有的相同数并排,没有共用的相邻格,因此难以调整,不妨改成下面的构造:

k
1 2 3 ... k
2 3 ... k 1
3 ... k 1 2
... . . . .
.. . . . ..
. . . . ...
k 1 2 3 ...

显然这样填出来依然合法,以将 \(k=4\) 时拓展到 \(k=8\) 为例,我们有

4           4           4           4           4
1 2 3 4     1 2 3 4     1 2 3 4     1 2 3 4     1 2 3 4
2 3 4 1 --> 2 3 4 5 --> 6 3 4 5 --> 6 7 4 5 --> 6 7 8 5
3 4 1 2     3 4 1 2     3 4 1 2     3 4 1 2     3 4 1 2
4 1 2 3     4 5 2 3     4 5 6 3     4 5 6 7     8 5 6 7

不难看出这样子一个尺寸为 \(n\) 的矩阵的容量是 \(2n\) 的,那么 \(n=500\) 的矩阵可以构造出 \(K=1000\) 的合法解,仿造上面的过程构造即可,复杂度是 \(O(n^2)\) 的。

AGC027D. Modulo Matrix

考虑我们钦定一个偏序关系,不妨对方格进行黑白染色,钦定所有黑色格子比相邻的所有白色格子都大。那么令 \(m=1\),黑色格子的值将是周围所有白色格子的值的 \(\text{lcm}+1\)

考虑如何钦定白色格子的值。为了让所有格子互不相同且不超上限,我们可以给每个白色格子钦定两个质因子,且次数均为 \(1\)。不难看出在一条斜线上的白色格子可以共用一个质因子,如下图构造:

prime A:    prime B:
2 0 3 0 5   19 0 17 0 13
0 3 0 5 0   0 19 0 17 0 
3 0 5 0 7 x 23 0 19 0 17
0 5 0 7 0   0 23 0 19 0
5 0 7 0 11  29 0 23 0 19

于是我们只需要使用前 \(1000\) 个质数,值的上界是 \(7907\),这样白色格子的值最多在 \(6.4\times 10^7\),而黑色格子本质上是 \(4\) 个质数的乘积 \(+1\),看起来值会达到 \(4\times 10^{15}\),但实际上限非常松,白格子和黑格子都完全卡不到上界,因此可以通过。

一个较为简单的实现是先构造出 \(500\times 500\) 的矩阵,最后只输出 \(n\times n\) 的子矩阵,复杂度是 \(O(n^2\text{poly}(\log a))\) 的。

AGC025D. Choosing Points

一个观察是不存在三个点都是格点的等边三角形,因此我们可以猜想如果对距离为 \(\sqrt{D}\) 的点连边,那么整张图构成二分图。

考虑证明这个事情,假设 \(D\) 能写成 \(4^k\cdot q(q\bmod 4\ne 0)\) 的形式,那么两个点横纵坐标之差应当可以写成 \(2^k\cdot a\)\(2^k\cdot b\) 的形式,那么我们有 \(a^2+b^2=q^2\)。将原图的 \((x,y)\) 改写为 \((a=\lfloor\frac{x}{2^k}\rfloor,b=\lfloor \frac{y}{2^k}\rfloor)\) 的形式,显然 \(a,b\) 相同的点之间的距离不可能为 \(\sqrt{D}\)。接着考察 \(q\bmod 4\) 的结果:

  • \(q\bmod 4=1\),那么此时 \(a,b\) 应当一奇一偶,因此按照 \(a,b\) 的奇偶性是否相同染上不同颜色。
  • \(q\bmod 4=2\),那么此时 \(a,b\) 应当都是奇数,因此按照 \(a\) 的奇偶性染上不同的颜色。

考虑现在每个点被两个 \(D\) 分别染上了颜色,相同颜色的点之间互相无法到达,可以分为白白、白黑、黑白、黑黑四种。那么根据鸽笼原理,\(4n^2\) 个点分成四类,至少有一类的个数到达 \(n^2\),找到这组点后输出即可。复杂度是 \(O(n^2)\) 的。

posted @ 2025-09-25 15:33  DycIsMyName  阅读(50)  评论(0)    收藏  举报