Acm算法
文章平均质量分 63
海风许愿
我始终相信,越努力,越幸运
展开
-
组合数 与卡特兰数
采用预处理方法,提前将所有的组合数都算出来,到时候直接查表采用的公式是 C(a,b) = C(a-1,b) + C (a-1,b-1)原创 2024-02-07 22:48:34 · 389 阅读 · 0 评论 -
逆元 与 扩展欧几里得(超级详细,c++)
若整数 b,m 互质,并且对于任意的整数 a,如果满足 b|a 则存在一个整数 x,使得 a /b ≡ a * x ( mod m ) 则称 x 为 b的模 m 的 乘法逆元,记为 b^−1 ( mod m)b 存在乘法逆元的充要条件是 b 与模数 m 互质。当模数 m 为质数时,b^(m−2) 即为 b 的乘法逆元。2) 快速幂逆元 (important)思路:当模m是质数时,x 的 逆元 就等于x的m-2次方 即x^-1 = x^(m-2)原创 2024-02-07 18:38:17 · 1135 阅读 · 0 评论 -
数论 之 欧拉函数篇
若是,i%p[ j ]==0,那么说明,p[ j ] 是 i 的一个质因子,那么 i* p[ j ] 的质因子与 i 是一摸一样的,区别只有i * p[ j ] 的质因子当中,p[ j ] 的次数多一个。性质2:如果p,q都是质数,那么ϕ ( p ∗ q ) = ϕ ( p ) ∗ ϕ ( q ) = ( p − 1 ) ∗ ( q − 1 )所以,根据欧拉函数定义,i与i* p[ j ] 的欧拉函数是相同的,即phi[ i ] = phi[ i* p[ j ] ]若是 ,i% p [ j ]!原创 2024-02-07 16:52:13 · 408 阅读 · 0 评论 -
数论 之 约数篇
那么我们合并同类项发现等于 sum = p1^0 *(p2^0 + p2^1 + p2^2) + p1^1 *(p2^0 + p2^1 + p2^2) = (p1^0 + p1^1) * ( p2^0 + p2^1 + p2^2)那么约数和 sum = (p1^0 + p1^1+…p1^a1) * (p2^0 + p2^1 +…公式:假设一个数的质因数为 p1^a1 , p2^a2, p3^a3, …公式:假设一个数的质因数为 p1^a1 , p2^a2, p3^a3, …原创 2024-02-07 15:48:56 · 383 阅读 · 2 评论 -
数论 之 质数篇
代码思路:因为要找的是质因子,所以每个因子都是质数,那么找到一个质因子x后,我们可以删掉这个数中所有的这个质因子x。优化代码可以只用质数筛,因为所有的合数都可以拆分为质因数的乘积,那么这个合数一定有一个质因子,所以可以只用质数筛。思路:用当前这个数字去筛掉他所有的倍数,因为只要是倍数,就说明这个倍数一定不是质因数,筛到最后,留下的都是质数。所以当i%pj]==0,也就意味着,p[j]是i的最小质因子,那就可以结束掉循环了。思路:求n是否为质数,只要从2开始到n-1,都不能整除n,那么说明n是质数,原创 2024-02-06 17:59:25 · 344 阅读 · 0 评论 -
树的重心(dfs深度搜索)
整体思路 :本质上就是使树尽可能的散碎,从一个点开始,直接低轨道到最低点,然后开始回溯,回溯的过程中计算各个连通块的中点的数量,因为每个结点都会存在有一条链没有被遍历,所以我们可以通过n-sum 得到那条链的结点的数目。邻接表存储树图 模板代码。dfs 搜索树 模板代码。原创 2023-12-22 12:13:50 · 424 阅读 · 1 评论 -
DFS 典型题之 n 皇后(c++版)
可能出现b<0 的情况,所以我们给b加一个数当偏移量c,至于这个数是多少无所谓,只要保证这个数 c+y-x>0即可。其实b是多少不重要,重要的是我们能用b来唯一确定这条对角线,作为一个唯一表示,来映射出这条直线。用数组剪枝一下,填的时候还要注意得能填,不能填的位置不能填,实现剪枝的效果。所以我们可以遍历每一行的所有列,只要在这个点放了皇后,那么直接进入下一行。能填的情况:这一行,这一列,这一正对角线,这一反对角线都无皇后。那么反对角线 y = -x +b 所以b = x+y;正对角线 b = y-x。原创 2023-12-04 20:24:49 · 119 阅读 · 0 评论 -
离散化(超详细)
有这么种情况,当整数范围很大,比如大到1e9,而数据范围很小,只有1e5甚至更小,我们若是想经常查询或者修改这些整数的位置,显而易见哈希就是很好的方法,但是由于整数太大,没有那么多数组将其存下,此时我们就可以用离散化的方法来解决上面是y总给出的定义,可能有点抽象,简而言之就是使用一个新的数组,这个新数组的值是原序列的下标,利用这个关系,建立起新数组的下标与原序列的关系,桥梁就是新数组的值 == 原序列的下标注意,原序列的下标是离散的,不是相邻的还是有点抽象,可以举个例子。原创 2023-11-21 17:52:50 · 287 阅读 · 0 评论 -
归并排序(c++代码)
将整个区间分为两部分,将数值小的排在前面,数值大的排在后面。最后所有小的都在前面,大的都在后面,达到了排序的目的。具体逻辑请看代码以及注释,注释写的比较清晰了。归并排序运用了分治的思想和双指针的算法。这四步往往第四步是难点也是重点。第一步 :确定递归终止条件。第二步:找到子区间分界点。第三步: 递归排序。原创 2023-08-01 22:02:30 · 241 阅读 · 1 评论 -
快速排序(c++)
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。从数列中挑出一个元素,称为"基准"(pivot)。原创 2023-08-03 22:39:53 · 47 阅读 · 0 评论 -
二分查找(c++)
二分查找相对简单,注意好边界处理的问题即可。本文主要是二分算法的模板的代码。注意的事项主要写在了注释当中。原创 2023-08-03 23:07:39 · 51 阅读 · 0 评论 -
快速幂(c++,超级详细)
如果我们打算求a^b, 我们可能会写一个for循环,乘以b次a,时间复杂度为O(b)当b比较小的时候还可以运用,但是当b很大,比如b=1000000,此时时间复杂度就显然很高了,我们需要对其进行优化 ———快速幂。原创 2023-11-20 20:21:37 · 442 阅读 · 0 评论 -
前缀和(c++,超详细,含二维)
当给定一段整数序列a1,a2,a3,a4,a5…an;每次让我们求一段区间的和,正常做法是for循环遍历区间起始点到结束点,进行求和计算,但是当询问次数很多并且区间很长的时候比如,10^5 个询问和10^6区间长度,相乘就是 10^11,这样在c++里面会远远的超时,此时我们就要请出一个求区间和的小技巧——前缀和。原创 2023-11-20 22:25:24 · 542 阅读 · 0 评论