
算法
文章平均质量分 69
算法
FoLiaGe丶
在学前端
展开
-
一文搞懂质数以及质数的筛法
因此只需要枚举到sqrt(n), 然后再判断是否n> 1(即看有没有除尽), 有则剩余的这个数一定是那个大于sqrt(n)的质因子。我们要遵循每一个合数只被最小的质数筛掉。核心思想: 就是用质数去把当前的合数筛掉,并且保证是用当前最小的素数筛掉的。大于1的整数中,如果只包含1和本身的这两个约数,那么就被叫做质数(素数)(这种算法的思想很重要, 用已经得到的结论去消除未来的部分不定数)对于当前的数i, 我们得到了所有2-i的质数的primes数组。一个合数一定是由质数的多少次方构成的形式 x = p。原创 2024-10-26 19:56:00 · 790 阅读 · 0 评论 -
前缀和&差分学习笔记
加上一个值c的时候,那么在b[i]加上c,那么后面都会加上值c,由于j后面不需要加上c,因此要在j+1的位置,减去c,那么在计算前缀和的时候后面值都会减去c,和前面加c抵消了。原理:由于a是b的前缀和,当我们在b[i]加上一个值c,那么在计算后面的前缀和的时候,都会加上c,当我们减上一个值,那么后面都会减去某个值。原数组: a[1], a[2], a[3], a[4], a[5], …原数组: a[1], a[2], a[3], a[4], a[5], …差分数组:b[1] ,b[2] , b[3]…原创 2022-11-22 18:07:19 · 195 阅读 · 1 评论 -
背包问题分析代码详解【01背包+完全背包+多重背包】
由于f[i,j-v]中多了一项f[i-1,j-(s+1)v]+sw,所以f[i-1,j-v]+w,f[i-1,j-2v]+2w,f[i-1,j-3v]+3w,…f(i,j−v)=max(f[i,j−v],f[i,j−2v]+w,⋯,f[i,j−(s+1)v]+sw)(滑动窗口已满)f(i,r+(s+1)v)=max(f[i,r+(s+1)v],f[i,r+sv]+w,⋯,f[i,r+v]+sw)(滑动窗口已满)简言之,在j........................原创 2022-07-20 23:05:19 · 4082 阅读 · 1 评论 -
最大公约数和最小公倍数数(GCD&LCM)
1.GCD的定义GCD 即最大公约数Greatest Common Divisor。整数 a 和 b 的最大公约数是指能同时整除 a 和 b 的最大整数,记为 gcd(a,b)。2.GCD的性质1) gcd(a,b)=gcd(a,a+b)=gcd(a,k⋅a+b)2) gcd(ka,kb)=k⋅gcd(a,b)。3) 多个整数的最大公约数:gcd(a,b,c)=gcd(gcd(a,b),c)。4) 若 gcd(a,b)=d,则 gcd(a/d,b/d)=1,即 a/d=与 b/原创 2022-04-02 16:28:38 · 2443 阅读 · 1 评论 -
二分搜索算法【原理&代码模板】
对一段区间进行二分处理,每次将区间一分为二,并只保留我们需要的区间,当区间长度为1的时候(l == r),这个时候l或r就是我们需要的答案。二分的本质并不是单调性。有单调性的一定可以二分,但可以二分的不一定有单调性。其本质是假如一段区间可以划分成两种状态,我们一定可以搜索到这两种状态的边界值。蓝色箭头指向的点就是我们二分搜索出来的答案。这两个点到底哪个是我们搜索的答案取决于我们的搜索策略。下面会介绍两种搜索策略的模板。模板一 当我们将区间[l, r]划分成[l, mid]和[mid + 1, r]时模原创 2022-06-20 17:49:43 · 219 阅读 · 0 评论 -
字符串哈希【算法】
当一个字符串规模很大,并且需要多次访问该字符串或者子串的时候,我们可以用哈希函数对每个字符串进行哈希,分别映射到不同的数字中去,即一个整数哈希值,然后我们可以根据哈希值找到需要的字符串。哈希函数是哈希的关键,首先理论上任何一个函数都能做哈希函数,但是在字符串哈希中,为了避免冲突采用了一种进制哈希的方式(BKDRHash)。原理:设定一个进制 P,需要计算一个字符串的哈希值时,把每个字符看成每个进制位上的一个数字,这个串转化成了一个基于进制 P 的数,最后对 M 取余数,就得到了这个字符串的哈希值。为简化计原创 2022-06-01 16:24:25 · 5587 阅读 · 1 评论 -
KMP字符串模式匹配算法【精简代码模板】
模式匹配(Pattern Matching)就是在一篇长度为n的文本S中,找某个长度为m的关键字P。KMP算法是由朴素字符串匹配算法优化而来,就是重新利用了朴素做法中浪费的一些有用信息。3. 如何实现优化朴素做法在朴素方法中,每次新的匹配都需要对比 S和 P的全部 m个字符,这实际上做了重复操作。例如第一轮匹配 S的前 3 个字符 “aaa” 和 P 的 “aab”,第二轮从 S 的第 2 个字符 ‘a’ 开始,与和 P 的第一个字符 ‘a’ 比较,这其实不必要,因为在第一轮比较时已经检查过这两个字符,原创 2022-06-01 15:37:50 · 767 阅读 · 0 评论 -
静态模拟实现链表、双链表、队列、栈、堆和哈希【数据结构】
一、单链表的静态实现//单链表代码模板int head,e[N],ne[N],idx;//head表示头指针,e【N】是记录链表的值//ne【N】表示下一个要访问的节点//idx表示当前用到哪个节点了//初始化void init(){ head = -1; idx = 0;}//在链表头插入一个数avoid insert(int a){ e[idx] = a,ne[idx] = head,head = idx,idx++;}//将第一个结点删除void remove原创 2022-05-29 20:55:23 · 381 阅读 · 0 评论 -
常见搜索模板DFS+BFS+二分搜索【算法】
本篇讲的是常见的搜索模板,搜索其实非常好写,下面我将已典型的题目为例子介绍几种常见的搜索方式。1.二分搜索#include<bits/stdc++.h>using namespace std;double n;const double eps = 1e-12;//二分搜索int main() { int t; cin>>t; while(t--) { cin>>n; double l = 0,r = 100000,res = .原创 2022-05-07 14:53:19 · 2095 阅读 · 1 评论 -
STL函数大全
目录一、数组-vector1.vertor的访问2.vector的初始化3.函数二、栈-stack三、链表-list1.初始化2.函数四、队列-queue1.初始化2.基本操作3.priority_queue的初始化4. priority_queue操作与链队列一致。五、集合-set1.初始化2.基本操作六、映射-map1.初始化2.操作函数一、数组-vectorvector是数组的一种类表示,它提供了自动内存管理.原创 2022-03-30 21:03:36 · 4665 阅读 · 3 评论 -
树状数组入门(代码模板)
#include<bits/sdtc++.h>using namespace std;//树状数组//特点:树状数组的编码并不麻烦,代码短小精悍,效率也高//常用来解决的问题类型:查询前缀和或者区间和。const int N = 1000;#define lowbit(x) ((x) & - (x))int tree[N]={0};void update(int x, int d) { //修改元素a[x], a[x] = a[x] + d while(.原创 2022-03-10 21:27:38 · 279 阅读 · 0 评论 -
点积和叉积【计算集合】
先简单看一道几何的题目吧。1.俩点之间的距离sqrt((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1))2.平面三角公式:p = (a+b+c)/2 S = sqrt(p*(p-a)*(p-b)*(p-c));在浮点运算时会产生精度误差,为了控制精度,一般设置一个偏差值eps,eps要大于浮点运算结果的不确定量,一般取1e-8;比较2个浮点数时,不能直接用==判断相等,可以选择用dcmp()函数来判断;二、点积和叉积。点积(Dot product)编程时计算点原创 2022-03-20 15:48:14 · 5724 阅读 · 0 评论