自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 收藏
  • 关注

原创 组合数 与卡特兰数

采用预处理方法,提前将所有的组合数都算出来,到时候直接查表采用的公式是 C(a,b) = C(a-1,b) + C (a-1,b-1)

2024-02-07 22:48:34 388

原创 逆元 与 扩展欧几里得(超级详细,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 1122

原创 数论 之 欧拉函数篇

若是,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 407

原创 数论 之 约数篇

那么我们合并同类项发现等于 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 382 2

原创 数论 之 质数篇

代码思路:因为要找的是质因子,所以每个因子都是质数,那么找到一个质因子x后,我们可以删掉这个数中所有的这个质因子x。优化代码可以只用质数筛,因为所有的合数都可以拆分为质因数的乘积,那么这个合数一定有一个质因子,所以可以只用质数筛。思路:用当前这个数字去筛掉他所有的倍数,因为只要是倍数,就说明这个倍数一定不是质因数,筛到最后,留下的都是质数。所以当i%pj]==0,也就意味着,p[j]是i的最小质因子,那就可以结束掉循环了。思路:求n是否为质数,只要从2开始到n-1,都不能整除n,那么说明n是质数,

2024-02-06 17:59:25 342

原创 树的重心(dfs深度搜索)

整体思路 :本质上就是使树尽可能的散碎,从一个点开始,直接低轨道到最低点,然后开始回溯,回溯的过程中计算各个连通块的中点的数量,因为每个结点都会存在有一条链没有被遍历,所以我们可以通过n-sum 得到那条链的结点的数目。邻接表存储树图 模板代码。dfs 搜索树 模板代码。

2023-12-22 12:13:50 424 1

原创 codeforces每日两道思维题(第 五 天)

GET w - 询问是否可以取当前多集的某个子集之和,并得到等于 w 的值。解题思路:贪心策略,每次从最后往前开始找,只要能减就减掉,总共29个数字。在这个问题中,最初会给你一个空的多集。在这个问题中,最初会给你一个空的多集。ADD x - 在多集合中添加一个等于 2^x 的元素;rating :未知。

2023-12-19 20:25:51 361

原创 codeforces每日两道思维题(第 四 天)

ak=n LCM(a1,a2,…,ak)≤n^2 这里 LCM 是 a1,a2,…,ak 的最小公倍数。思路:选出三个数,提起的数用1补,我们可以确定,每个n都能分为这样的数,至于原理,我现在还没证明出。找到 k 个正整数 a1,a2,…我们可以证明,在给定的约束条件下,答案总是存在的。

2023-12-09 11:33:21 66

原创 codeforces每日两道思维题(第 三 天)

你的任务是编写一个程序,找出比赛结束时可能形成的朋友对的最小和最大数量。输入: 输入只有一行,包含两个整数 n 和 m,用一个空格隔开(1 ≤ m ≤ n ≤ 10^9) — 参与者的数量和团队的数量。输出: 输出只有一行,包含两个整数 kmin 和 kmax — 可能的朋友对的最小数量和最大数量。剩余的情况,最大朋友对数就是其余团队都是1人,最多人数的那个团队的朋友对数。首先要考虑特殊情况,当m==1时,只有一个团队,那么朋友的对数是固定的。当n==m时,每个团队有且只能有一个人,所以一定是没有朋友的。

2023-12-06 11:59:45 71

原创 codeforces每日两道思维题(第 三 天)

重新排列这些数字,使得满足 |a1−a2|≤|a2−a3|≤…≤|an−1−an|,其中 |x| 表示 x 的绝对值。每个测试用例的第一行包含一个整数 n(3≤n≤105)— 数组 a 的长度。输出 对于每个测试用例,输出满足给定条件的数组 a 的重新排列版本。每个测试用例的第二行包含 n 个整数 a1, a2, …,两个数距离的位置越远说明差的绝对值越大,最大的差就是最后一个数字减去第一个数字。注意,数组 a 中的所有数字不一定不同。输入 第一行包含一个整数 t(1≤t≤104)— 测试用例数。

2023-12-06 10:57:19 50

原创 codeforces每日两道思维题(第 二 天)

此外,你想要使游戏更具挑战性,由于上坡或平地比下坡更难走,级别的难度将是山的数量 i(1≤i<n),使得 hi≤hi+1,其中 hi 是第 i 座山的高度。你已经选择了 n 座山的高度,并希望安排它们,以便第一座和最后一座山的高度差的绝对值尽量小。比终点矮的山,都要放在终点前,这样保证了终点这座山没有被浪费,其余的放在起点后由小到大输出即可。这道题的意思是,只要后面一座山的高度大于等于前面这座山,那我们就认为游戏总难度+1,首先,找到高度差绝对值最小的两座山放在起点和重点,小山在前,高山在后。

2023-12-05 16:07:33 40

原创 codeforces每日两道思维题(第 二 天)

如果为偶数,那么前k-1个数字我们让他是n/k,最后一个数字是n/k+n%k,因为n%k是偶数,所以最后一个数字的奇偶性跟前k-1个数字是相同的,这就是答案。如果继续加一个k,此时就是n%k+2 * k,因为2 * k是偶数,不改变原数字奇偶性,所以等同于没加,所以不需要继续加。所以,根据这个特性,我们只需要判断最后一个数字加上n%k之后会不会发生奇偶性变化,即判断n%k是否为偶数。如果n%k此时是奇数,那么我们可以将前k个数字都-1,判断n%k+k是否是偶数,如果是偶数,那么存在答案。

2023-12-05 13:36:44 36

原创 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 115

原创 codeforces每日两道思维题(第一天)

an 的数组,使得和 (a1+a2+⋯+an) 能够被 k 整除,且数组 a 中的最大元素是可能的最小值。1)当n < k 时,我们让每个数组都取 k/n ,这样因为会出现下取整,整体答案是不够k的,那么再让一部分数字加上1,答案就是k/n+1。如果不能整数,那么就要扩大到距离最近的能够整除的数字,也就是令n = (n/k+1)*k;2)当n==k时,因为数字个数正好等于总和k,那直接让所有的ai = 1就是答案。若是本身n%k==0 那么直接让ai 都等于 n/k就是答案。那么此时的答案就是n/k。

2023-12-04 16:37:59 46

原创 codeforces每日两道思维题(第一天)

例如,如果 A=6,B=4,则整数 24 和 72 是好的,整数 6、660 和 12 是几乎好的,整数 16 和 7 既不是好的也不是几乎好的。这道题的思路其实挺简单,当 b = 1时,因为所有的a的倍数都是好数,所以我们找不到几乎好的数,那么一定是No。这三个数字是一定不相等的,并且因为 a*(b+1) % (a * b) = a % (a * b)!要找到三个不同的正整数 x、y 和 z,其中正好有一个是好的,另外两个是几乎好的,并且满足 x+y=z。如果一个整数可以被 A⋅B 整除,则它是好的;

2023-12-04 09:39:15 55

原创 离散化(超详细)

有这么种情况,当整数范围很大,比如大到1e9,而数据范围很小,只有1e5甚至更小,我们若是想经常查询或者修改这些整数的位置,显而易见哈希就是很好的方法,但是由于整数太大,没有那么多数组将其存下,此时我们就可以用离散化的方法来解决上面是y总给出的定义,可能有点抽象,简而言之就是使用一个新的数组,这个新数组的值是原序列的下标,利用这个关系,建立起新数组的下标与原序列的关系,桥梁就是新数组的值 == 原序列的下标注意,原序列的下标是离散的,不是相邻的还是有点抽象,可以举个例子。

2023-11-21 17:52:50 237

原创 前缀和(c++,超详细,含二维)

当给定一段整数序列a1,a2,a3,a4,a5…an;每次让我们求一段区间的和,正常做法是for循环遍历区间起始点到结束点,进行求和计算,但是当询问次数很多并且区间很长的时候比如,10^5 个询问和10^6区间长度,相乘就是 10^11,这样在c++里面会远远的超时,此时我们就要请出一个求区间和的小技巧——前缀和。

2023-11-20 22:25:24 512

原创 快速幂(c++,超级详细)

如果我们打算求a^b, 我们可能会写一个for循环,乘以b次a,时间复杂度为O(b)当b比较小的时候还可以运用,但是当b很大,比如b=1000000,此时时间复杂度就显然很高了,我们需要对其进行优化 ———快速幂。

2023-11-20 20:21:37 378

原创 ST表(静态+动态)

ST表是一种对数组的特殊的应用技巧,是一种处理max(a,a) = a或者有这种类似性质函数的数据结结构。

2023-11-13 14:31:43 150

原创 c++常用知识点总结

写在最前面:这是我大一刚开始学c++自己边学边整理的知识点汇总,可能整理的比较乱,敬请大家谅解,重要的知识点都有单独的文章详细介绍1 scanf与cin//scanf输入格式int a;sancf("%d",&a);//cin读入格式cin>>a;//scanf和cin都不能输入空格(遇到空格,回车,结束符会自己停止)2 char数组输入带有空格的字符串2.1 gets char s[10]; gets(s);//VS需要加_s,用gets_

2023-11-09 17:47:38 308

原创 2、背包九讲之第二讲(完全背包问题)

同样直接算并不是很好算,那我们开始曲线救国,先从前i-1种类物品里面选择,然后再加上第i种物品的选择情况,即 dp[ i -1,j-k*v[i] ] +k * w[ i ],我们不难发现,其实选0个可以与后面的合并,也就是k==0的情况。与0/1背包问题类似,我们第i个物品可以选0个,那么dp[ i,j] = dp[i-1,j];求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。有 N 种物品和一个容量是 V 的背包,每种物品都有无限件可用。我们也可以选则1个,2个,3个,…

2023-11-08 23:46:48 34

原创 1、背包九讲之第一讲(0/1背包问题)

但是为什么 j 改成了倒叙开始遍历呢,是因为在原二维的计算方法中,二维使用的都是i-1层的数据,但是换成一维后,我因为j>j-v[i],所以dp[j-v[i]]已经被赋值过了,即dp[ i , j -v[ i ] ]已经被赋值过了,所以我们现在使用的是i层的dp[ j -v[ i ] ],但是显然这是不合理的,所以我们要倒叙计算,先计算大的,再去计算小的,那么就不存在数据污染这种情况了。接下来有 N行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。输出一个整数,表示最大价值。

2023-11-07 20:22:11 45

原创 中缀转前缀和后缀表达式及计算

算法思想:表达式中的对象为操作数和运算符,因此需要维护两个栈表:运算符栈和操作数(中间运算结果)栈,具体算法步骤如下。

2023-09-17 20:14:27 542 3

原创 STL容器之map映射(c++详细版)

(1) 基本定义和初始化//定义一个空的string->int的映射mp[2] = "我喜欢你"(2 )使用insert函数初始化//定义一个空的string->int的映射map<int,string> mp = {{1,"wcm"},{2,"我喜欢你"}};

2023-09-10 19:01:13 128

原创 typedef /define/ using区别(c++超详细版)

using typedef #define 都可用于c++创建别名。

2023-09-10 13:49:38 217

原创 c++ pair详细教学

pair 是c++标准库中的一个模板类,用于存储两个不同类型的对象或值。它通常用于将两个相关的值结合在一起,例如,可以存储键值对也可以在需要返回两个值的函数中使用它。pair可以使用关系运算符来进行比较,比较的是第一个元素,如果第一个元素相等,则比较第二个。pair只能存储两个值,如果需要更多的组合,可以考虑使用tuple或自定义结构体。使用.first和.second成员老访问pair第一个和第二个元素。有关结构体定义,可以看我这篇博客。

2023-09-10 13:30:08 586

原创 c++ STL之set集合

/ 1 使用默认构造函数//创建一个空的整数集合// 2 使用初始化列表// 创建包含整数的集合并初始化// 3 使用迭代器范围//利用另一个集合创建// 4 利用自定义函数创建//改变了默认升序的排序原则// 5 使用复制函数构造//副本构造法。

2023-09-09 22:08:35 192

原创 c++ STL容器之vector(超详细教程)

vector是变长数组,支持随机访问,不支持在任意位置O(1)插入。为了保证效率,元素的增删一般应该在末尾进行。头文件 #include。

2023-09-09 17:48:11 134

原创 c++动态分配空间new与malloc

当使用c++需要动态分布内存空间时,通常有malloc和new。

2023-09-09 10:53:56 94

原创 c++常用库函数(超级详细版)

合并函数的核心思想是设置两个头指针,分别指向两个升序数组首地址,通过比较两个头指针的大小,每次都将小的数值放入新的数组,然后小数值指针后移,最后新的数组也是有序的,从而完成合并过程,复杂度为。无序数组的包含问题就像是字符串应用中的最长公共子序列,解法是动态规划,而有序数组的包含则是简单的判断问题,解法类似有序数组的合并。,其作用是将两个集合交成一个集合,同样的要求输入的两个集合必须是有序的。,其作用是计算出两个集合的对称差集,同样的,要求输入的两个集合必须是有序的。

2023-09-08 19:04:03 6523

原创 Python3(超详细python3,三万字教程)

本章节主要说明 Python 的运算符。4 + 5 = 9例子中,4和5被称为操作数称为运算符。算术运算符比较(关系)运算符赋值运算符逻辑运算符位运算符成员运算符身份运算符运算符优先级接下来让我们一个个来学习Python的运算符。

2023-08-08 16:56:25 3957

原创 c++高精度除法(超详细,有样例模拟)

与高精度乘法一样,高精度除法也是一个大数字除以一个小数字。四种高精度运算的思路都很相似。

2023-08-06 12:30:28 880 1

原创 c++高精度乘法(有超详细模拟样例)

跟高精度加法和高精度减法有所不同 ,高精度乘法只有一个大数字a,b是小数字,可以直接输入,不用开辟新数组。请同时结合代码体会下面的讲解,不然是看不懂的。本代码主要用于一个大数乘以一个小数。本代码中,t依旧是代表进位。本代码不支持两个大数相乘。

2023-08-05 23:34:47 604 1

原创 c++高精度减法(超详细,有模拟样例和注解)

这里我们给出112-99=13举例讲解sub函数部分。高精度减法,同高精度加法一样,利用数组保存每位数字。请同时结合代码体会下面的讲解,不然是看不懂的。同高精度加法一样,c++也不支持高精度减法。

2023-08-05 22:26:53 290 1

原创 c++高精度加法(超详细,有样例和注解,c++)

c++是不自带高精度运算的,这时候我们就要自己模拟高精度运算下面有详细样例注解思路是我们用数组保存这个大数字的每一位,因为涉及到进位问题,所以我们让个位先开始存进数组,即 下标为0的数组存的是个位,下标为1存十位,以此类推这样当最后一个数位涉及到进位时,我们可以很轻松自然的在数组最后一位加一本题中的t,是当前两位数字的和,即n1[i]+n2[i],它的范围是0

2023-08-04 23:37:26 235 1

原创 二分查找(c++)

二分查找相对简单,注意好边界处理的问题即可。本文主要是二分算法的模板的代码。注意的事项主要写在了注释当中。

2023-08-03 23:07:39 50

原创 快速排序(c++)

重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。从数列中挑出一个元素,称为"基准"(pivot)。

2023-08-03 22:39:53 45

原创 归并排序(c++代码)

将整个区间分为两部分,将数值小的排在前面,数值大的排在后面。最后所有小的都在前面,大的都在后面,达到了排序的目的。具体逻辑请看代码以及注释,注释写的比较清晰了。归并排序运用了分治的思想和双指针的算法。这四步往往第四步是难点也是重点。第一步 :确定递归终止条件。第二步:找到子区间分界点。第三步: 递归排序。

2023-08-01 22:02:30 220 1

原创 队列(考研,数据结构,408)

队列简称队,也是一种操作受限的线性表,只允许在队尾插入,在队头删除,其特性是先进先出。

2023-07-27 17:53:27 36 1

原创 Acwing4740. 跑圈

我的思路:总体思路是记录下每次经过机器时,此次跑步的方向,若是有两次方向相同且挨着,那么说明这次跑步是有效的,也就是被机器记录下来了。思路:将每次的跑步方向与上次的跑步方向进行对比,如果发生变化,将新的跑步方向作为正方向,上次的跑步方向视为反方向。第三次和第二次方向相同且挨着,那么说明第三次跑步有效,有效次数加一。第五次和第四次挨着且方向相同,那么说明第五次跑步有效,有效次数加一。第二个和第一个方向相同且挨着,说明第二次跑步有效,有效次数加一。每次更新后,都将新的跑步方向视为正方向。最后共计三次有效跑步。

2023-07-25 16:54:48 41

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除