摘要:
求解最大公约数常用欧几里得算法(即辗转相除法) 设a、b均为正整数,则$gcd(a,b)=gcd(b,a\%b)$ 证明:设$a=kb+r$,其中k和r分别为a除以b得到的商和余数。则有$r=a-kb$成立。 设d为a和b的一个公约数,那么由$r=a-kb$,得d也是r的一个约数。因此d是b和r的一 阅读全文
摘要:
如果要求一个正整数N的因子个数,只需要对其质因子分解,得到各质因子$P_i$的个数分别为$e_1$、$e_2、...、e_k$,于是N的因子个数就是$(e_1+1)*(e_2+1)*...*(e_k+1)$。原因是对每个质因子$P_i$都可以选择其出现$0$次、$1$次、...、$e_i$,共$e_ 阅读全文
摘要:
二分查找的高效在于,每一步都可以去除当前区间中的一半元素,因此这种算法的时间复杂度是$O(logn)$ 二分的前提是该序列是有次序的,例如递增或递减 //序列中是否存在满足某条件的元素 int binarySearch(int A[],int left,int right,int x) { int 阅读全文
摘要:
万能头文件:#include<bits/stdc++.h> 优点:几乎包含了所有c++标准库头文件 缺点:这不是标准的头文件,所以有的OJ不支持。而且编译的时间相对长 关闭stream同步,加快cin读入的速度:ios::sync_with_stdio(false) 但仍然不要将cin和scanf或 阅读全文
摘要:
当需要开数组存储状态的时候,要根据提供的内存限制选择适合的数据类型和数组大小。 1TB=1024GB 1GB=1024MB 1MB=1024KB 1KB=1024Byte 1Byte=8bit 例如当题目中的内存限制为128MB,即(128*1024*1024)Bytes>10^10Bytes,代表 阅读全文
摘要:
当我们要在一组数据中找到最小/大值或者前K大/小值的时候,我们可以使用传统的遍历方法。那么这个时候时间复杂度就是$O(N^2)$,但我们可以使用"堆"来进行优化,我们可以把找到最小/大值的复杂度降低到$O(logN)$。插入一个新值的复杂度也是$O(logN)$。 维护一个堆关键的就是向下维护和向上 阅读全文
摘要:
关于素数的定义:在大于1的自然数中,除了1和它本身以外不再有其他因数。 判断一个数是否是素数: int x; // 要求的数 for(int i=2;i<=sqrt(x);++i) { if(x%i==0) { cout << "这不是素数" << endl; break; } } 埃氏筛法(时间复 阅读全文
摘要:
并查集通常用来判断一组数据里面的包含关系,因此核心就是find()以及merge()两个功能 int box[10005]; void initial(int limit) { for(int i=0;i<=limit;++i) { box[i]=i; //初始化 } } int find(int 阅读全文
摘要:
算法复杂度:$O(nlogn)$ (递归为$O(logn)$) 快速排序算法当序列中元素的排列比较随机时效率最高,但是当序列中元素接近有序时,会达到最坏时间复杂度$O(n^2)$,产生这种情况的主要原因在于主元没有把当前区间划分为两个长度接近的子区间。因此我们应该随机选择主元或者取中间的数据作为主元 阅读全文
摘要:
指针实现: 操作运行时间均为[latex]O(1)[/latex] 缺点是对malloc和free的调用昂贵 #include <cstdio> #include <malloc.h> #include <cstdlib> struct Node; typedef struct Node *PtrT 阅读全文