一些算法&&数据结构&&数论
elbadaernu
这个作者很懒,什么都没留下…
展开
-
gcd&&lcm 辗转相除法
代码如下int gcd(int a,int b)//最大公约数{ if(b==0)return a; else return gcd(b,a%b);}int lcm(int a,int b)//最小公倍数{ return a/gcd(a,b)*b;}原创 2017-03-31 10:26:16 · 348 阅读 · 0 评论 -
Stirling数
第一类Stirling数: 第二类Stirling数:原创 2017-09-27 21:12:14 · 215 阅读 · 0 评论 -
最长递增子序列 nlogn
排序+LCS算法和dp算法的时间复杂度都是n^2,在有些题目中容易被卡,所以有时候会用到nlogn 的时间复杂度来解。假设存在一个序列d[1..9] = 2 1 5 3 6 4 8 9 7,可以看出来它的LIS长度为5。 下面一步一步试着找出它。 我们定义一个序列B,然后令 i = 1 to 9 逐个考察这个序列。 此外,我们用一个变量Len来记录现在最长算到多少了首先,把d[1]有序地放到B转载 2017-03-21 22:23:03 · 560 阅读 · 0 评论 -
lower_bound和upper_bound
头文件 #include < algorithm >lower_bound :返回一个非递减序列[first, last)中的第一个大于等于值val的位置. upper_bound:返回一个非递减序列[first, last)中第一个大于val的位置. #include <stdio.h>//#include <bits/stdc++.h>#include < algorithm >usi原创 2017-07-17 20:49:56 · 265 阅读 · 0 评论 -
二分图匹配的一些概念
http://www.cnblogs.com/kuangbin/archive/2012/08/26/2657446.htmlhttp://www.cnblogs.com/shenben/p/5573788.htmlhttp://blog.jobbole.com/106084/mark一下原创 2017-08-04 23:55:31 · 238 阅读 · 0 评论 -
算术基本定理
定理定义:任何一个大于1的自然数N,都可以唯一分解成有限个质数的乘积 ,这里均为质数,其诸指数是正整数。这样的分解称为N的标准分解式。定理应用: 1.一个大于1的正整数N,如果它的标准分解式为: , 那么它的正因数个数为 2.它的全体正因数之和为 当 时就称N为完全数。 是否存在奇完全数,是一个至今未解决之猜想。 3.利用算术基本定理可以重新定义整数a和b的最大公因子 和最小原创 2017-07-21 18:25:57 · 1484 阅读 · 0 评论 -
求解单个欧拉函数板子(O(sqrt(n)))
//直接求解欧拉函数 LL euler(LL n){ //返回euler(n) LL res=n,a=n; for(LL i=2;i*i<=a;i++){ if(a%i==0){ res=res/i*(i-1);//先进行除法是为了防止中间数据的溢出 while原创 2017-08-08 23:56:09 · 1057 阅读 · 0 评论 -
拓展欧几里得模板
#include <iostream> using namespace std; #define ll long longint exgcd(int a,int b,int& x,int& y)//模板{ if(!b){ x=1; y=0; return a; } else{ exg原创 2017-08-08 17:24:11 · 209 阅读 · 0 评论 -
不定方程的求解
步骤如下: 求a * x + b * y = n的整数解。 1、先计算Gcd(a,b),若n不能被Gcd(a,b)整除,则方程无整数解;否则,在方程两边同时除以Gcd(a,b),得到新的不定方程a’ * x + b’ * y = n’,此时Gcd(a’,b’)=1; 2、利用欧几里德算法求出方程a’ * x + b’ * y = 1 的一组整数解x0, y0,则n’ * x0, n’* y原创 2017-05-10 21:34:08 · 1319 阅读 · 0 评论 -
素数筛
#include <stdio.h>//#include <bits/stdc++.h>#include <iostream>#include<algorithm>using namespace std;int prim[1000005]={2,3,5};//素数是分为基本素数{2,3}、阳素数{6N+1,N>=1}形式的、阴素数{6N-1,N>=1}形式的//为了代码的好写,在这里这样原创 2017-07-21 09:57:59 · 241 阅读 · 0 评论 -
最短路径算法复杂度总结
Dijkstra:O(n2)适用于权值为非负的图的单源最短路径,用斐波那契堆的复杂度O(E+VlgV), BellmanFord:适用于权值有负值的图的单源最短路径,并且能够检测负圈,复杂度O(VE) SPFA:适用于权值有负值,且没有负圈的图的单源最短路径,论文中的复杂度O(kE),k为每个节点进入Queue的次数,且k一般<=2,但此处的复杂度证明是有问题的,其实SPFA的最坏情况应该是O(转载 2017-04-26 11:06:58 · 1157 阅读 · 0 评论 -
一些常用的存图数据结构
邻接矩阵:是直接利用一个二维数组对边的关系进行存储,矩阵的第i行第j列的值 表示 i -> j 这条边的权值;特殊的,如果不存在这条边,用一个特殊标记来表示;如果i == j,则权值为0。它的优点是实现非常简单,而且很容易理解;缺点也很明显,如果这个图是一个非常稀疏的图,图中边很少,但是点很多,就会造成非常大的内存浪费,点数过大的时候根本就无法存储。邻接表:是图中常用的存储结构之一,每个顶点都有一个原创 2017-05-07 21:41:25 · 835 阅读 · 0 评论 -
树的直径
树的直径是指树的最长简单路。 求法:两遍dfs或者bfs:先任选一个点作为起点,然后dfs/bfs一遍,找到离它最远的一个点x,那么这个点x即为最长路的一个端点。然后我们再以这个点x作为起点进行第二次dfs/bfs,找到的最长路(x->y)即为树的直径。原创 2017-05-07 18:33:54 · 384 阅读 · 0 评论 -
除法取模与逆元
逆元: 对于正整数a和m,如果ax≡1(mod m),(即ax%m=1),那么把这个同余方程中x的最小正整数解叫做 a模m的逆元。 一个数有逆元的充分必要条件是gcd(a,m)=1,此时逆元唯一存在除法取模a/b mod m等价于a*b’mod m (b’是b模m的逆元)下面是几种求逆元的方法1.扩展欧几里得代码如下 #include<stdio.h> #define ll long lon原创 2017-03-21 17:27:23 · 917 阅读 · 0 评论 -
博弈论知识汇总
博弈知识汇总 有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可。两个 人轮流从堆中取物体若干,规定最后取光物体者取胜。这是我国民间很古老的一个游戏 ,别看这游戏极其简单,却蕴含着深刻的数学原理。下面我们来分析一下要如何才能够 取胜。 (一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规 定每次至少取一个,最多取m个。最后取光者得胜。转载 2017-04-16 15:23:28 · 450 阅读 · 0 评论 -
sg函数模板(打表)
int sg[maxn];//sg[n] n表示每堆数量int s[k];//每次能取的值,下标从0开始,0 ~ k-1,必须有序,可以sort(s,s+k);bool vis[maxn];const int k;//k是集合s的大小 void get_sg(){ int i,j; for(i=0;i<maxn;i++) { memset(vis,0,原创 2017-04-17 22:16:56 · 2168 阅读 · 0 评论 -
RMQ算法
1. 概述RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大值。这两个问题是在实际应用中经常遇到的问题,下面介绍一下解决这两种问题的比较高效的算法。当然,该问题也可以用线段树(也叫区间树)解决,算法复杂度为:O(N)~O(logN),这里我们转载 2017-03-16 21:16:20 · 237 阅读 · 0 评论 -
快速幂取模
代码如下#define LL long long LL pow(LL x,LL n,) { LL res=1; while(n>0) { if(n & 1) res=(res*x)%Max; x=(x*x)%Max; n >>= 1; } retu原创 2017-03-19 22:51:02 · 275 阅读 · 0 评论