快晴

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

# 算法竞赛进阶指南--打卡--数学知识篇--0x30

算法竞赛进阶指南--打卡--数学知识篇--0x30

①:可见的点(欧拉函数,暴力)

在一个平面直角坐标系的第一象限内,如果一个点(x,y) 与原点 (0,0)的连线中没有通过其他任何点,则称该点在原点处是可见的。

例如,点 (4,2) 就是不可见的,因为它与原点的连线会通过点(2,1)

部分可见点与原点的连线如下图所示:

3090_1.png

编写一个程序,计算给定整数 N 的情况下,满足 0xyN 的可见点 (xy)的数量(可见点不包括原点)。

我们考虑一个东西,什么点不可能被遇见。

如果点(x,y)可见,则(kx,ky)一定不可见。

也就是,如果gcd(x,y)!=1则一定不可见,也就是x,y不互质一定不可见。

那么显然,互质一定可见。

因此题目就是求欧拉函数的前缀和。

因为(1,1)可见,但是欧拉函数的计算中未被加入,因此最后给总量加上一即可。

②: 最幸运的数字 (推公式,数论)

8 是中国的幸运数字,如果一个数字的每一位都由 8 构成则该数字被称作是幸运数字。

现在给定一个正整数 L,请问至少多少个 8 连在一起组成的正整数(即最小幸运数字)是 L 的倍数。

由题,有条件L|8(10x1)9,。求x的最小正整数解

我们可以对上式进行一些变形:

L|8(10x1)99L|8(10x1)

我们记有d=gcd(8,L)

显然有9L|8(10x1)9Ld|8(10x1)d

由于gcd(8d,9)=1 and gcd(8d,Ld)=1

因此9Ld8d互质。因此9Ld|8(10x1)d9Ld|10x1

上式等价于10x1mod9Ld,求x的最小正整数解。

当同余方程axcmodb有解时,gcd(a,b)|c为充分必要条件。

由于本题较为特殊,发现如果有解则gcd(10,9Ld)=1

证明:

显然gcd(10,9)=1,并且$\gcd(\frac{8}{d},\frac{L}{d})=1\iff \gcd(8,\frac{L}{d})=1 \gcd(8,10)=2$。

综合上述式子,gcd(8,10,Ld)=1,故gcd(10,Ld)=1

故必然有gcd(10,9Ld)=1

因此很容易,我们利用欧拉定理即可解出一个解x0。但是此解不一定为最小解。

可以推导出,最小解一定为x0的一个因子。

证明:

反证法:

对于同余方程ax1modn,并且gcd(a,n)=1。如果有解x,对于xφ(n)

xφ(n)φ(n)=kx+r,r(0,x)

由欧拉定理,有aφ(n)1modn

故有akx+r1modn。由于x为同余方程的一个解,则ax1modn

ax1modnakx1modn

所以有,ar1modn,由于r<x,且解r符合要求,故r为较小解,直至r=0时,x才为最小解。故最小解为当前解的某个因子。

因此我们从小到大枚举x0的因子,第一个符合答案即为最小解。

③: 异或运算 (线性基,异或高斯消元)

说实话,感觉这道题比之前的开关问题的异或方程更形象

给定你由 N 个整数构成的整数序列,你可以从中选取一些(至少一个)进行异或(XOR)运算,从而得到很多不同的结果。

请问,所有能得到的不同的结果中第 k小的结果是多少。

1N,Q10000,1ki1018

由于“异或”符合交换律与结合律,故可以按照高斯消元法逐步消元求解。

关键大概就是上面的这句话。

我们将个整数按顺序从大到小排序。

N个整数,我们将其各个二进制位提出,作为未知数,但是没有发现常数项,观察题目,发现无所谓。

我们对N条方程高斯消元,对多只会剩下64条方程组。

由于高斯消元进行线性变换,其向量组合张成的空间无变化。也就是我们可以使用64条方程组代表N条方程组能做到事。(我事线代垃圾,只能这样解释了)

我们在上面的操作过后,消元得到整数表示的方程组一定严格递增。

我们这里只要特判一个点:

方程是否有零向量

显然,对于任意零向量zero异或任何向量any都为any

对于每一个询问第k小。

不存在零向量时,显然我们可以按照k二进制从低到高位数上为是否1从而从小到大对整数进行异或。

为什么呢?对于消元后的整数A[i]>A[i+1],高斯消元,保证存在唯一解的未知数只出现一个为1的系数,否则均为0

因此系数为1越高位的二进制位数越靠前出现,保证我们一堆数越小,就尽可能保证越高为不会出现,因此我们尽可能选小的数。由于每一个数最多选一次,因此k的二进制正形式好符合性质。

但是题目要求不同结果

故存在零向量时,大小不断仅在最末端添加零元素,其他时候与零元素无关。也就是我们对k取二进制时事先减一即可。

④: 最大公约数 (推公式,线性筛递推欧拉函数)

给定整数 N,求 1x,yNGCD(x,y) 为素数的数对 (x,y) 有多少对。

GCD(x,y))即求 xy 的最大公约数。

我们要求GCD(x,y)=质数。显然,对于任意一个数x,都可以表示成1x

我们假设存在数对(x,y),x<y。若gcd(x,y)=1gcd(kx,ky)=k

故我们只要求存在多少互质的数对即可,同上方的题目"可见的点"。

但是数据范围为1e7,暴力算欧拉函数显然不可取。

因此我们由欧拉函数的推论

欧拉函数的推论:
①若p为质数,且p|np2|n,则φ(n)=φ(n/p)p

②若p为质数,且p|np2n,则φ(n)=φ(n/p)(p1)

故采用线性筛的思想,可以在O(n)的时间内求出[1,n]的所有欧拉函数。

⑤: 龙哥的问题 (欧拉函数,暴力,推公式)

龙哥现在有一道题,要考考大家。

给定一个整数 N,请你求出 1iNgcd(iN)的值。

如果存在数x=gcd(a,b),a<b,则x一定属于a,b的因子。

因此对于上式1iNgcd(iN),我们只要按照N的因子di枚举即可。

假设gcd(i,N)=di,则i=k1di,N=k2di

显然,gcd(idi,Ndi)=1

因此所有gcd(i,N)=di的情况共有φ(Ndi)种。

因此可以推出公式res=i=1kφ(Ndi)di

⑥: 矩阵幂求和 (矩阵乘法,分治)

给定 n×n 矩阵 A 和正整数 k,求和 S=A+A2+A3++Ak

1n30,1k109,1m<104

我们对每一个矩阵进行矩阵快速幂,显然复杂度为O(kn3logn)

考虑优化。

显然对于式子T=A+A2+...+Am与式子P=Am+1+Am+2+...+A2m

TAm=P。因此公式右半边可以等价于公式左半边乘以一个因子。

分治的想,我们会以mid递归左边部分即可,通过左边部分结果推出右半边结果。

最后合并,得到整个式子的值。

显然,对于公式的项存在奇数个时,我们需要额外加上右边最后的值,快速幂求解即可。

复杂度为O(logkn3logn)

⑦: 反素数 (乱搞,约数)

对于任何正整数 x,其约数的个数记作 g(x),例如g(1)=1g(6)=4

如果某个正整数 x 满足:对于任意的小于 x 的正整数 i,都有 g(x)>g(i),则称 x 为反素数。

例如,整数 1246 等都是反素数。

现在给定一个数 N,请求出不超过 N 的最大的反素数。

1N2109

根据题意,我们要求不超过N的约数最多的数。

由唯一分解定理,每一个数M,(M>1)均能分解为若干个质数pi的乘积。

因此可以表示为M=p1k1p2k2...pmkm

因此对于任意一个数的约数个数NUM=i=1m(ki+1)

因此我们可以考虑枚举对于数T,T<=N,并且数T由各个质数pi乘积组合而成。

显然,232>2109,因此对于所有pi>=2,其指数的最大值不会超过32,并且指数的最大值减小的很快。

那么我们质数应该枚举到多少为止呢?

显然,对于任意数M,(M>1),约数不少于两个。因此对于任意质数P,PP>N,枚举该P是无意义的。因此我们只需要枚举[1,sqrt(N)]范围内的质数即可。

由于上述情况我们考虑M,(M>1),排除M=1的情况在外,因此对于N=1时特判即可。

一个DFS就能直接搜索出来结果了,还特别快()

复杂度:O(2N+NlnN32)

⑧: 剪纸游戏 (博弈论,SG函数)

⑨: 新NIM游戏 (异或高斯消元,博弈论,SG函数)

posted on   快晴  阅读(133)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示