2024.3.17 - 3.22
Sun
Contest
Luogu月赛两题 / ARC两题
比较简单不做题解说明
智者的考验
【JSOI2012】
有一个 \(H\times W\) 的矩阵,初始全 \(0\),共有 \(H+W\) 个开关,编号分别为 \(1\sim (H+W)\),每一个开关对应一行或一列,操作该开关会将其对应的行/列的数字取反(\(0\to 1, 1\to 0\))。
给出一个 \(H\times W\) 的 \(01\) 矩阵 \(M\),我们认为操作后的矩阵与 \(M\) 相等则操作者是不好的。
有三种操作,共计 \(n\) 个人,\(m\) 个操作:单人修改操作开关,区间修改操作开关,询问区间中不好的操作者数量。
\(H\leq 2,W\leq 3,n\leq 10^6,m\leq 1.2\times 10^5\)。
格子多一点就要 Hash 了,但是这里最多 \(6\) 个格子,直接用二进制转数值,值域 \([0,64)\)。
暴力查找所有可能的开关状态发现只有 \(16\) 种,重新标号一下,不然就是【天台MLE OIer一位】。
一次操作,等价于一次异或,可以处理出每一个开关相当于异或了什么,询问相当于查询前缀异或值。
区间 Cover 包含单点 Cover 情况,故不考虑单点修改。
发现如果要将 \([l,r]\) 修改成异或 \(x\),记前 \(i\) 个数的异或值为 \(S_i\),则相当于把 \([l,r]\) 中下标与 \(l\) 同奇偶性的 \(S\) 改成 \(S_{l-1}\oplus x\),不同奇偶性的改成 \(S_{l-1}\),并把 \([r+1,n]\) 做一个区间异或。
所以用线段树维护奇数下标Cover、偶数下标Cover、区间异或Tag、各异或值的出现次数即可通过。
码长比较恐怖。
最大连通子块和
给定一棵 \(n\) 个节点的树,\(m\) 个操作,要么单点修改点权,要么查询某棵子树的最大连通块权值和。
\(n,m\leq 2\times 10^5\)。
考虑朴素 DP,记 \(f_{i,0}\) 表示以 \(i\) 为根的子树中包含 \(i\) 的最大连通块权值和,而 \(f_{i,1}\) 表示 \(i\) 的所有子节点的 \(f_{i,0}\) 中的最大值,故:
套路性地拿出所有轻儿子,令:
则:
那么有:
然后,321上树剖,但是发现 \(f_{i,1}\) 的部分是取较大值,所以需要一个可以支持快速删除、查询最大值的数据结构(堆、多重集、平衡树……都可以)。
本题记得乘上初始转移矩阵,行向量/列向量均可,上述所写应乘列向量。
Mon
算法复杂度
【CTSC1998】
给定一个程序,包含循环(包括 break
与 continue
语句)以及做若干单位操作,以多项式形式输出其时间复杂度,计算常系数。
保证:程序不长,不超过 \(20\) 层循环嵌套,系数不超过 \(10^9\)。
本题是继【THUPC2019】鸭棋(码长:5.31KB)与【THUPC2021】群星连结(码长:10.39KB)后的又一道紫色大模拟,本题码长为 2.94KB。
考虑将循环抽象出来,我们可以看作是一棵树形结构,而 \(\texttt{begin <statement> end}\) 是根,如果一个 loop 直接嵌套另一个 loop,则两个 loop 之间有边。
不妨称每一个点的复杂度是直接属于该 loop 的单位操作的复杂度,每一条边乘上下一个 loop 的循环次数,由于 \(n\) 的存在,分讨常系数以及 \(n\) 即可。
对于一条边,以下称 \((x,y)\) 表示常系数以及 \(n\) 的次数增加值。
拿 C++ 代码举个例子:
for(int i=1;i<=n;i++) A
for(int j=1;j<=3;j++) B
for(int k=1;k<=n;k++) C
do_operation(20)
那么 \(\text{root}\) 向 \(A\) 连一条 \((1,1)\) 的边,\(A\) 向 \(B\) 连一条 \((3,0)\) 的边,\(B\) 向 \(C\) 连一条 \((1,1)\) 的边,且 \(C\) 的点权为 \(20\)。
再举一个:
for(int i=1;i<=n;i++) A
{
for(int j=1;j<=n;j++) B
{
do_operation(1)
break;
}
continue;
do_operation(2);
}
那么 \(\text{root}\) 向 \(A\) 连一条 \((1,1)\) 的边,\(A\) 向 \(B\) 连一条 \((1,0)\) 的边,\(A\) 的点权不是 \(2\) 而是 \(0\),因为 continue
跳过了后面的操作,且 \(B\) 的转移系数是 \((1,0)\) 不是 \((1,1)\),因为 break
结束了之后的循环。
然后就非常简单了,dfs 这棵树即可,典型模拟部分:字符串转数字,多项式输出。
博弈论初探
取石子游戏 1
一堆 \(n\) 个石子,Kaho/Suzune 先后轮流取石子,数量在 \([1,k]\) 之间,不能取的失败,问胜者。
\(n,k\leq 10^9\)。
注意到 \(SG(x) = x\bmod {k+1}\),判断 \(n\) 是否是 \(k+1\) 的倍数。
Bash 博弈经典,也可以理解为一方取 \(x\) 个时另一方可以取 \(k+1-x\) 个进行循环。
取石子游戏 2
\(n\) 堆石子各 \(A_i\) 个,Kaho/Suzune 先后轮流取石子,数量在 \([1,\infty)\) 之间,不能取的失败,问胜者。
\(n\leq 10^5,a_i\leq 10^9\)。
注意到单堆 \(SG(x)=x\),根据 SG 定理有 \(SG(G) = SG(A_1)\oplus SG(A_2) \oplus \cdots \oplus SG(A_n)\)。
Nim 游戏经典。
取石子游戏 3
\(n\) 堆石子各 \(A_i\) 个,Kaho/Suzune 先后轮流取石子,数量是 \(S\) 中的一个元素,不能取的失败,问胜者。
\(n\leq 10^5, A_i\leq 10^4, \forall x\in S, x\leq 10^4, |S|\leq 100\)。
注意到 \(SG\) 可以按照石子数目递推,各堆石子独立,故使用 SG 定理。
移棋子游戏 1
给定一张 DAG \(G\),上有 \(n\) 个点,\(m\) 条边,\(k\) 个棋子,Kaho/Suzune 先后取一个可以移动的棋子,移动到它可以直接到达的点,不能移动的失败,问胜者。
\(n,m\leq 5000, k\leq 10^5\)。
注意到 \(SG\) 函数递推与该游戏基本一致,直接递推 \(SG\) 即可。
各棋子相互独立,运用 SG 定理即可。
取石子游戏 4
\(n\) 堆石子,初始时都没有加入游戏,Kaho/Suzune 先后做如下操作之一,不能操作的失败,问胜者:
- 拿出若干堆未加入游戏的石子放入游戏。
- 从游戏中有的石子堆中选择一堆任意取石子。
\(n\leq 14\),可以做到 \(n\leq 10^6\)。
注意到这很像 Nim 游戏,而 Nim 游戏要求石子堆数目的异或值不为 \(0\) 才能必胜。
先手一定要选择石子,所以拿出最多数目的石子使得异或值为 \(0\),对于剩下的石子的全部子集的异或值不为 \(0\)。
这等价于找出是否存在一个子集的异或值为 \(0\),暴力枚举即可。
Tue
Hard Nim
记得注意考虑的相关范围!!!
州区划分
【WC2018】
给定一张图 \(G\),点有点权,声明一个点集 \(V\) 合法当且仅当所有 \((u,v)\in G, u,v\in V\) 与 \(V\) 构成的图没有欧拉回路,权值为点集内所有点的点权总和。
图 \(G\) 的一组合法划分为若干组不交点集的有序排列,权值为【各点集权值总和】与【各点集前面与之本身权值总和】的占比的 \(p\) 次方的乘积。
求 \(G\) 的所有合法划分的权值总和。
\(|V_G|\leq 21\)。
一张图有欧拉回路仅当如下两点成立:
- 图连通。
- 没有奇数度数的点。
于是暴力枚举所有点集是否合法,然后令 \(f_S\) 表示考虑到点集 \(S\) 的权值总和,令 \(v_S\) 表示点集 \(S\) 内所有点有:
这是子集 DP,子集卷积优化即可。
Set
【COCI2021-2022#1】
给定 \(n\) 个三进制数,求有多少组数 \((x,y,z)\) 满足其三进制异或下为 \(0\)。
\(n\leq 3^{12}\),各数据满足 \(0\leq x < 3^{12}\)。
这题只需要解决:任意进制FWT异或卷积。
本题直接套用相关结论即可。
取石子游戏 5
\(n\) 堆石子各 \(A_i\) 个,Kaho/Suzune 先后轮流取石子,取的石头堆在最左边或最右边,不能取的失败,问胜者。
\(n\leq 1000\)。
分讨,启动!
设 \(L_{l,r}\) 表示在石子堆 \([l,r]\) 左边再放一堆大小为 \(L_{l,r}\) 的石子该局面必败, \(R_{l,r}\) 表示在石子堆 \([l,r]\) 右边再放一堆大小为 \(R_{l,r}\) 的石子该局面必败。
引理 1:所有 \(L_{l,r},R_{l,r}\) 均唯一。
证明:假设某 \(L_{l,r}\) 取值为 \(a,b\),不妨令 \(a < b\),此时有必败态 \(b\) 向必败态 \(a\) 转移,此时不合法,故所有 \(L_{l,r},R_{l,r}\) 均唯一。
引理 2:所有 \(L_{l,r},R_{l,r}\) 均存在。
证明:假设某 \(L_{l,r}\) 取值不存在,不妨考虑局面 \([x,a_l,\cdots,a_r]\),此时分两种情况:
- 先手拿掉 \(x\) 中的一些,此时转移到必胜态,故不合法。
- 先手拿掉 \([l,r]\) 中的一些,此时转移到一个必败态,从 \(x\) 中拿掉一些依旧是必败态,故不合法。
故所有 \(L_{l,r},R_{l,r}\) 均存在。
于是考虑 \(\mathcal{O}(n^2)\) 递推 \(L_{l,r},R_{l,r}\),类似区间 DP 的思想,以下证明针对 \(L_{l,r}\),而 \(R_{l,r}\) 对称即可。
初始情况:\(L_{i,i}=R_{i,i}=a_i\),显然先后手可以反复做同样的操作然后后手胜利。
接下来记 \(L\) 为当前所讨论的 \(L_{l,r-1}\),记 \(R\) 为 \(R_{l,r-1}\),记 \(x\) 为 \(a_r\),根据题意 \(x>0\),且一定有 \(R=0\) 时 \(L=0\)。
- \(x=R\)
- 此时根据 \(R\) 的定义,该局面为必败态,此时 \(L_{l,r}=0\)。(A)
- \(x < R\)
- \(0 < x < L\)
- 结论:\(L_{l,r} = x\)
- 证明:假设当前局面为 \([x,a_l,\cdots,a_{r-1},x]\),当先手取左右端时后手对称直到先手取完一堆,此时轮到后手,局面为 \([0,a_l,\cdots,a_{r-1},y]\) 或 \([y,a_l,\cdots,a_{r-1},0]\),此时必然有 \(0 < y\leq x\),且 \(y < L, y< R\),则此时该局面必胜。(B)
- \(x\ge L\)(C)
- 结论:\(L_{l,r} = x + 1\)
- 证明:
- 假设先手取最左端的石子:
- 若将最左端的石子取成 \(y\) 个,且 \(y > L\),后手将右端的石子取成 \(y-1\) 个,回到该情况。
- 若将最左端的石子取成 \(L\) 个,后手清空最右端的石子,先手此时必败。
- 若将最左端的石子取成 \(y\) 个,且 \(L > y > 0\),后手将右端的石子取成 \(y\) 个,回到情况 B。
- 若取完最左端的石子,则有 \(L\leq x < R\),此时后手必胜。
- 假设先手取最右端的石子:
- 若将最右端的石子取成 \(y\) 个,且 \(y\ge L\),后手将右端的石子取成 \(y+1\) 个,回到该情况。
- 若将最右端的石子取成 \(y\) 个,且 \(L > y > 0\),后手将左端的石子取成 \(y\) 个,回到情况 B。
- 若取完最右端的石子,则后手可以将最左端的石子取成 \(L\) 个,此时先手必败。
- 假设先手取最左端的石子:
- \(0 < x < L\)
- \(x > R\)
- \(x\leq L\)(D)
- 结论:\(L_{l,r} = x - 1\)
- 证明:
- 假设先手取最左端的石子:
- 若将最右端的石子取成 \(y\) 个,且 \(y\ge R\),后手将右端的石子取成 \(y+1\) 个,回到该情况。
- 若将最右端的石子取成 \(y\) 个,且 \(R > y > 0\),后手将左端的石子取成 \(y\) 个,回到情况 B。
- 若取完最右端的石子,则后手可以将最左端的石子取成 \(R\) 个,此时先手必败。
- 假设先手取最右端的石子:
- 若将最右端的石子取成 \(y\) 个,且 \(y > R\),后手将左端的石子取成 \(y-1\) 个,回到该情况。
- 若将最右端的石子取成 \(R\) 个,后手清空最左端的石子,先手此时必败。
- 若将最右端的石子取成 \(y\) 个,且 \(L > y > 0\),后手将左端的石子取成 \(y\) 个,回到情况 B。
- 若取完最左端的石子,则有 \(0 < x < L\),此时后手必胜。
- 假设先手取最左端的石子:
- \(x > L\)
- 结论:\(L_{l,r}=x\)
- 证明:
- 若先手将一端的石子取成 \(y\) 个,且 \(y > L, y > R\),回到该情况。
- 若先手将一端的石子取成 \(y\) 个,且 \(y < L, y < R\),回到情况 B。
- 若先手取完一端的石子,则后手将另一端取至必败状态,此时先手必败。
- 若最左端石子满足 \(L+1\leq y\leq R\),最右端石子满足 \(L\leq z\leq R-1\),回到情况 C。
- 若最左端石子满足 \(R\leq y\leq L-1\),最右端石子满足 \(R+1\leq z\leq L\),回到情况 D。
- 若最左端石子满足 \(y=L\),最右端石子满足 \(z=R\),取完一堆到达必败局面。
- \(x\leq L\)(D)
到此讨论完毕,初始局面是否必胜可以判断 \(a_1\) 与 \(L_{2,n}\) 的关系,或者 \(R_{1,n-1}\) 与 \(a_n\) 的关系。
二分图博弈问题
谁能赢呢? / 移棋子游戏 2
【中山市选2009】
给定一个 \(n\times n\) 大小的棋盘,左上角有一个棋子,Kaho/Suzune 轮流移动石头。每一回合,选手只能把石头向上下左右四个方向移动一格,并且要求移动到的格子之前不能被访问过。谁不能移动石头了就算输。假如 Kaho 先移动石头,而且两个选手都以最优策略走步,问最后谁能赢?
\(n\leq 10^4\)。
套用结论,若 \(n\) 为偶数先手必胜,否则后手必胜。
\(n\) 为偶数时,所有点都在最大匹配中。
\(n\) 为奇数时,总可以构造一组最大匹配不包括左上角。
Wed
取石子游戏 6
\(n\) 堆石子,Kaho/Suzune 先后做如下操作之一,不能操作的失败,问胜者:
- 选择一堆石子拿走一个。
- 合并任意两堆石子。
\(n\leq 50, a_i\leq 1000\)。
注意到当前能进行的操作数量取决于当前石子数量总和 \(y_1\) 以及石子堆数 \(y_2\),大部分情况下一步操作会使得 \(y_1\) 减一或者 \(y_2\) 减一,只有一个例外:取走一堆数量为 \(1\) 的石子,此时 \(y_1,y_2\) 同时减一。
记 \(f_{i,j}\) 表示有 \(i\) 个数量为 \(1\) 的堆,数量大于 \(1\) 的堆剩下了 \(j\) 次操作,则有:
- 若 \(i=0\),此时取决于 \(j\) 的奇偶性。
- 若 \(j=1\),此时直接转为 \(f_{i+1,0}\),因为此时这堆石子数量为 \(1\)。
- 取掉一个数量为 \(1\) 的堆,此时向 \(f_{i-1,j}\) 转移。
- 将一个数量为 \(1\) 的堆合并到数量 \(>1\) 的堆,此时向 \(f_{i-1,j+1}\) 转移。
- 合并两个数量为 \(1\) 的堆,若此时有数量 \(>1\) 的堆可以再次合并,此时向 \(f_{i-2,j+2+[j>0]}\) 转移。
- 取掉一个数量 \(>1\) 的堆,此时向 \(f_{i,j-1}\) 转移。
- 取掉一个数量为 \(2\) 的堆,此时感觉要往 \(f_{i+1,j-3}\) 转移。笔者认为:如果此时将这一堆的操作视为数量 \(>1\) 的操作,然后反手把它合并到一个数量 \(>1\) 的堆上,这两步操作正好将状态送到 \(f_{i,j-2}\) 处,所以问题不大。
游戏 / 移棋子游戏 3
【JSOI2009】
给定一个 \(n\times m\) 大小的棋盘,棋盘上有障碍,初始某位置有一个棋子,Kaho/Suzune 轮流移动石头。每一回合,选手只能把石头向上下左右四个方向移动一格,并且要求移动到的格子之前不能被访问过。谁不能移动石头了就算输。假如 Kaho 先移动石头,而且两个选手都以最优策略走步,问在哪些位置 Suzune 能赢?
\(n,m\leq 100\)
根据相关结论,本题需要求【不是在任意二分图最大匹配上都存在的点】。
具体地,运用匈牙利算法跑出一组最大匹配,然后从所有不在最大匹配上的点 \(u\) 开始不断通过连接的边标记相邻点 \(v\) 的匹配 \(c_v\),此时 \(c_v\) 也不一定在二分图最大匹配中,不断搜索即可。
兔兔与蛋蛋游戏 / 移棋子游戏 4
【NOI2011】
给定一个 \(n\times m\) 大小的棋盘,棋盘上有黑棋白棋与一个空位,Kaho/Suzune 轮流移动自己的棋子到空位。每一回合,选手只能把石头向上下左右四个方向移动一格。谁不能移动棋子了就算输。假如游戏共 \(k\) 轮,Kaho 先移动石头,而且两个选手都以最优策略走步,Suzune 最后赢得游戏,请问 Kaho 的失误决策。
\(n,m\leq 40, k\leq 1000\)
这相当于空位在两种颜色之间来回移动,果断建立二分图,于是本题转化为求每一个空格是否在任意最大匹配上,这可以对每一个空格分别标记然后重新增广。
注意,每进行一步移动都会导致前面的决策锁定,这需要标记这些点不去匹配,而不是直接套用上一题的相关结论。
Thur
Candy Piles
【AGC002E】
给定 \(n\) 堆石子,第 \(i\) 堆石子 \(a_i\) 个,Kaho/Suzune 轮流做如下操作,无法操作者失败,问谁胜利。
- 将所有石子堆都拿走一个石子。
- 将拥有最多石子的石子堆其中之一拿走。
\(n\leq 10^5, a_i\leq 10^9\)。
首先降序考虑,要么全体减一,要么弹出队头。
将各数字画成一列对应数量的格子,两种操作分别对应向上一格与向右一格。
换成网格图,就是其上一条路径,到达网格图边界时游戏结束。
其上有一些必胜点与必败点,让我们找找规律:不考虑边界,同一条对角线上的格点胜负状态一致。
于是找到原点对应的最右上角那个点,转化为求那个点的胜负状态。
当这个点往上到边界下方的点的距离与这个点往右到边界左方的点的距离中有至少一个是奇数时,该点必败,否则必胜。
江南乐
【HNOI2014】
给定 \(n\) 堆石子,Kaho/Suzune 轮流做如下操作,无法操作者失败,问谁胜利。
- 选择一堆数量 \(\ge F\) 的石子堆,尽量平均的分为 \(M(M\ge 2)\) 堆。
\(n\leq 100, a_i,F\leq 10^5\)。
题目相当于求范围内所有正整数 \(x\) 的 \(SG\) 值,首先 \([1,F)\) 全部为 \(0\),然后:
对于一个 \(x\),我们枚举 \(2\leq m\leq x\),然后这 \(x\) 个石子将被分为 \(m\) 堆,其中 \(x\bmod m\) 堆有 \(\lceil{\frac{x}{m}}\rceil\) 个,\(m - (x\bmod m)\) 堆有 \(\lfloor{\frac{x}{m}}\rfloor\) 个,所有 \(m\) 对应到的 \(SG\) 的异或值的 \(\operatorname{mex}\) 即为 \(SG(x)\)。
我们只关注出现奇数次的石子堆数目,取值只有上下取整两种,考虑在整除分块下做该问题。
假设对应 \(m\) 的取值区间为 \([l,r]\),对应整除结果为 \(d\)。
引理:在同一 \(d\) 下,两种石子堆数目的奇偶性的 \(4\) 种情况中仅存在 \(2\) 种。
证明:先将 \(x\bmod m\) 转为 \(x - dm\),则其中 \(x-dm\) 堆有 \(\lceil{\frac{x}{m}}\rceil\) 个,\(m(d+1) - x\) 堆有 \(\lfloor{\frac{x}{m}}\rfloor\) 个。
-
若 \(d\) 是奇数,则 \(m(d+1) - x\) 奇偶性不变。
-
若 \(d\) 是偶数,则 \(x-dm\) 奇偶性不变。
于是只有 \(2\) 种情况,且 \(l\) 与 \(l+1\) 一定不一致,算这两个值即可。
时间复杂度为 \(\mathcal{O}(V\sqrt{V})\)。
Pocky Game
【AGC048D】
一根 Pocky 饼干分 \(n\) 段,第 \(i\) 段共计 \(a_i\) 微单位长度,Kaho/Suzune 轮流做如下操作,吃掉饼干的最后一口的人胜利,问谁胜利。
- 在当前自己咬住的这一段下选择一个长度然后将其咬下,不可以跨过段与段的分界。
\(n\leq 100, a_i\leq 10^9\)。
记 \(a\) 为原始饼干段长度,\(a'\) 为游戏中的实时饼干段长度。
引理:两人只会选择咬下 \(1\) 单位长度或者一整段。
证明:如果当前这一段的 Pocky 很长,比其他段加起来都长,那么可以一直咬这一段,等对方咬完剩余段的时候咬下全部,然后 I win。
那么每个人都会尽快找到一个满足当前这一段饼干比其他段加起来都多的一段饼干,然后轻松取得胜利。
不妨记 \(f_{l,r}\) 表示 \([l+1,r]\) 属于 \(a\),那么让 Kaho 胜利的最短饼干长度 \(a'_l\),记 \(g_{l,r}\) 表示 \([l,r-1]\) 属于 \(a\),那么让 Suzune 胜利的最短饼干长度 \(a'_r\)。
首先有 \(f_{i,i}=g_{i,i}=1\),因为此时可以咬下全部。
然后考虑转移:
- 若 \(g_{l+1,r} > a'_r\),此时咬下第 \(l\) 段可以将必败局面留给对方,故此时 \(f_{l,r} = 1\)。
- 若 \(f_{l,r-1} > a'_l\),此时咬下第 \(r\) 段可以将必败局面留给对方,故此时 \(g_{l,r} = 1\)。
否则,玩家需要与对手“耗长度”,此时一定是每人每回合咬下 \(1\) 单位长度直至进入上面的情况之一:
- 先手必胜需要进入情况 \(g_{l+1,r} > a'_r\),那么需要 \(a'_l - f_{l,r-1} > a'_r - g_{l+1,r}\),故 \(f_{l,r} = a_r - g_{l+1,r} + f_{l,r-1} + 1\)。
- 后手必胜需要进入情况 \(f_{l+1,r} > a'_l\),按照上述式子类比。
于是本题完成,时间复杂度为 \(\mathcal{O}(n^2)\)。
你说的对,但是 Kaho 和 Suzune 可以玩 Pocky Game,而你不行。
约数个数和
【SDOI2015】
多次给定 \(n,m\),求如下表达式的值:
\(T,n,m\leq 50000\)。
首先有:
具体而言,假设 \(x\) 的质因数分解有 \(p^a\) 项,而 \(y\) 的质因数分解有 \(p^b\) 项,则 \(xy\) 的必然包含 \(p^{a+b}\) 项。
设 \(m\mid xy\),考虑 \(m\) 中 \(p\) 的指数 \(c\),若 \(c\leq a\) 在 \(x\) 中选 \(p^c\),否则在 \(y\) 中选 \(p^{c-a}\) 并在 \(x\) 中选 \(p^a\)。
故完成映射,观察我们选出数字的方式,一定有 \(\gcd(i,j)=1\),不可能同时在 \(x,y\) 中选。
令 \(n\leq m\)。
先预处理每个数的整除分块值,然后本题复杂度为 \(\mathcal{O}(T\sqrt{n})\)。
Fri
数表
【SDOI2014】
定义矩阵 \(M\) 满足 \(M_{i,j}\) 表示 \(\gcd(i,j)\) 的约数和,多次求 \(M\) 中前 \(n\) 行 \(m\) 列的部分中元素 \(\leq a\) 的元素和。
\(T,n,m\leq 10^5\)。
首先,\(\leq a\) 是搞人的,所以把这个先丢掉,于是有:
预处理 \(\sigma_1(x)\),按照值排序,读入所有询问按 \(a\) 排序,每次把一个 \(d\) 的贡献加入树状数组维护即可。
时间复杂度为 \(\mathcal{O}(n\log_2^2 n + n\sqrt{n}\log_2n)\)。
未来程序
【WC2015】【提交答案】
给定 \(10\) 个程序及其输入数据,在本地跑出其对应的输出数据。
Task 1
执行若干次加法,本质上是乘法,用 __int128
进行即可,或者写个类似快速幂的东西求都可以。
期望运行时间 \(\texttt{1s}\)。
Task 2
执行若干次赋值,注意到每一次循环会重新用 \(a,b,c\) 进行运算得到新的 \(a',b',c'\),观察得到其矩阵递推式为:
矩阵快速幂即可,期望运行时间 \(\texttt{1s}\)。
还是个倒着的杨辉三角。
Task 3
求 \(n\) 以内自然数的 \(0,1,2,3,4\) 次方和,特别的,\(0^0=1\)。
直接套公式即可:
高精度交给 Python,矩阵快速幂即可,期望运行时间 \(\texttt{1s}\)。
Task 4
给定一个 01 矩阵,求:
- 有多少个有序坐标二元组,满足两个位置上的值都是 \(1\)。
- 对每个为 \(1\) 的位置求最近的 \(0\) 的位置,距离为曼哈顿距离。
子问题 \(1\):记 \(x\) 为 \(1\) 的个数,则答案为 \(x(x-1)\)。
子问题 \(2\):写一个 DP 即可,四个方向都做一遍。
期望运行时间 \(\texttt{1s}\)。
Task 5
给定一个 01 矩阵,求有多少个全 1 的子矩阵。
经典单调栈问题,记以当前点为右下角的矩阵数量。
期望运行时间 \(\texttt{1s}\)。
Task 6
给定 \(a,b,c\),每次将 \(t\) 改为 \(at^2+b\) 自然溢出后对 \(c\) 取余,求 \(n\) 次操作后的结果。
没什么规律,不妨找循环节,采用 Floyd 判环即可。
期望运行时间 \(\texttt{90s}\)。
Task 7
求解 \(16\times 16\) 的数独。
加两个优化:只尝试填写可填写的数字,优先填写可能性较少的位置。
期望运行时间 \(\texttt{10s}\)。
Task 8
七重循环枚举 \(a,b,c,d,e,f,g\),对十种不同的偏序关系组计数,答案对质数 \(1234567891\) 取余。
断言答案会是一个关于 \(n\) 的不超过 \(10\) 次的多项式,拉格朗日插值即可。
期望运行时间 \(\texttt{1s}\)。
Task 9
求十个字符串,已知 MD5。
第一问与第二问:只枚举数字,长度限制在 \(6\) 即可。
第三问:找到当年讲课的老师,把名字一个一个试一遍。
第四问:长度限制在 \(3\) 即可。
第五问至第九问:先把长度控制在 \(5\sim 6\) 然后跑。
第十问:不好推,有了解的人就会知道是什么。
名言:We hold these truths to be self-evident. 来源于美国独立宣言。
期望运行时间 \(\texttt{2s}\)。
Task 10
给定大量函数的嵌套关系,求底层程序的执行次数。
发现函数调用呈 DAG 样,写个程序把 DAG 建出来然后简单跑个 DP。
期望运行时间 \(\texttt{1s}\)。
于神之怒加强版
多次给定 \(n,m\),并给定定值 \(k\),试求如下表达式的值:
\(T\leq 10^4, n,m,k\leq 5\times 10^6\)。
直接上莫反:
已知 \(f(x)=x^k, g(x)=\mu(x)\),则 \((f\cdot g)\) 为积性函数,线性筛即可。
这里讲一下怎么筛:
需要:各素数的 \(k\) 次方的值。
时间复杂度为 \(\mathcal{O}(T\sqrt{n})\)。