# 算法竞赛进阶指南--打卡--数学知识篇--0x30
算法竞赛进阶指南--打卡--数学知识篇--0x30
①:可见的点(欧拉函数,暴力)
在一个平面直角坐标系的第一象限内,如果一个点 与原点 的连线中没有通过其他任何点,则称该点在原点处是可见的。
例如,点 就是不可见的,因为它与原点的连线会通过点。
部分可见点与原点的连线如下图所示:
编写一个程序,计算给定整数 的情况下,满足 的可见点 的数量(可见点不包括原点)。
我们考虑一个东西,什么点不可能被遇见。
如果点可见,则一定不可见。
也就是,如果则一定不可见,也就是不互质一定不可见。
那么显然,互质一定可见。
因此题目就是求欧拉函数的前缀和。
因为可见,但是欧拉函数的计算中未被加入,因此最后给总量加上一即可。
②: 最幸运的数字 (推公式,数论)
是中国的幸运数字,如果一个数字的每一位都由 构成则该数字被称作是幸运数字。
现在给定一个正整数 ,请问至少多少个 连在一起组成的正整数(即最小幸运数字)是 的倍数。
由题,有条件,。求的最小正整数解
我们可以对上式进行一些变形:
我们记有
显然有
由于 and
因此与互质。因此
上式等价于,求的最小正整数解。
当同余方程有解时,为充分必要条件。
由于本题较为特殊,发现如果有解则。
证明:
显然,并且$\gcd(\frac{8}{d},\frac{L}{d})=1\iff \gcd(8,\frac{L}{d})=1 \gcd(8,10)=2$。
综合上述式子,,故。
故必然有。
因此很容易,我们利用欧拉定理即可解出一个解。但是此解不一定为最小解。
可以推导出,最小解一定为的一个因子。
证明:
反证法:
对于同余方程,并且。如果有解,对于。
则。
由欧拉定理,有
故有。由于为同余方程的一个解,则。
所以有,,由于,且解符合要求,故为较小解,直至时,才为最小解。故最小解为当前解的某个因子。
因此我们从小到大枚举的因子,第一个符合答案即为最小解。
③: 异或运算 (线性基,异或高斯消元)
说实话,感觉这道题比之前的开关问题的异或方程更形象
给定你由 个整数构成的整数序列,你可以从中选取一些(至少一个)进行异或()运算,从而得到很多不同的结果。
请问,所有能得到的不同的结果中第 小的结果是多少。
由于“异或”符合交换律与结合律,故可以按照高斯消元法逐步消元求解。
关键大概就是上面的这句话。
我们将个整数按顺序从大到小排序。
个整数,我们将其各个二进制位提出,作为未知数,但是没有发现常数项,观察题目,发现无所谓。
我们对条方程高斯消元,对多只会剩下条方程组。
由于高斯消元进行线性变换,其向量组合张成的空间无变化。也就是我们可以使用条方程组代表条方程组能做到事。(我事线代垃圾,只能这样解释了)
我们在上面的操作过后,消元得到整数表示的方程组一定严格递增。
我们这里只要特判一个点:
方程是否有零向量
显然,对于任意零向量异或任何向量都为。
对于每一个询问第小。
不存在零向量时,显然我们可以按照二进制从低到高位数上为是否从而从小到大对整数进行异或。
为什么呢?对于消元后的整数,高斯消元,保证存在唯一解的未知数只出现一个为的系数,否则均为。
因此系数为越高位的二进制位数越靠前出现,保证我们一堆数越小,就尽可能保证越高为不会出现,因此我们尽可能选小的数。由于每一个数最多选一次,因此的二进制正形式好符合性质。
但是题目要求不同结果
故存在零向量时,大小不断仅在最末端添加零元素,其他时候与零元素无关。也就是我们对取二进制时事先减一即可。
④: 最大公约数 (推公式,线性筛递推欧拉函数)
给定整数 ,求 且 为素数的数对 有多少对。
)即求 的最大公约数。
我们要求=质数。显然,对于任意一个数,都可以表示成。
我们假设存在数对。若则。
故我们只要求存在多少互质的数对即可,同上方的题目"可见的点"。
但是数据范围为,暴力算欧拉函数显然不可取。
因此我们由欧拉函数的推论
欧拉函数的推论:
①若为质数,且,,则②若为质数,且,,则
故采用线性筛的思想,可以在的时间内求出的所有欧拉函数。
⑤: 龙哥的问题 (欧拉函数,暴力,推公式)
龙哥现在有一道题,要考考大家。
给定一个整数 ,请你求出 的值。
如果存在数,则一定属于的因子。
因此对于上式,我们只要按照的因子枚举即可。
假设,则。
显然,。
因此所有的情况共有种。
因此可以推出公式。
⑥: 矩阵幂求和 (矩阵乘法,分治)
给定 矩阵 和正整数 ,求和 。
我们对每一个矩阵进行矩阵快速幂,显然复杂度为。
考虑优化。
显然对于式子与式子
有。因此公式右半边可以等价于公式左半边乘以一个因子。
分治的想,我们会以递归左边部分即可,通过左边部分结果推出右半边结果。
最后合并,得到整个式子的值。
显然,对于公式的项存在奇数个时,我们需要额外加上右边最后的值,快速幂求解即可。
复杂度为。
⑦: 反素数 (乱搞,约数)
对于任何正整数 ,其约数的个数记作 ,例如。
如果某个正整数 满足:对于任意的小于 的正整数 ,都有 ,则称 为反素数。
例如,整数 等都是反素数。
现在给定一个数 ,请求出不超过 的最大的反素数。
根据题意,我们要求不超过的约数最多的数。
由唯一分解定理,每一个数均能分解为若干个质数的乘积。
因此可以表示为
因此对于任意一个数的约数个数
因此我们可以考虑枚举对于数,并且数由各个质数乘积组合而成。
显然,,因此对于所有,其指数的最大值不会超过,并且指数的最大值减小的很快。
那么我们质数应该枚举到多少为止呢?
显然,对于任意数,约数不少于两个。因此对于任意质数,枚举该是无意义的。因此我们只需要枚举范围内的质数即可。
由于上述情况我们考虑,排除的情况在外,因此对于时特判即可。
一个DFS就能直接搜索出来结果了,还特别快()
复杂度:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】