摘要: 欧几里德算法也就是一般说的辗转相除法。代码框架如下:int gcd(int a, int b) { return b ? gcd(b, a%b) : a;}粗略估计需要进行O(log b)次整数运算。实际上,当n固定后gcd(m, n)的平均迭代次数(m <= n)近视为(12*ln2 / π2)*ln(n) 。(不知道怎么证明的-_-!) 扩展欧几里德算法 设gcd(a, b) = d,则存在正整数x, y满足ax + by = d。算法框架int x, y;int ext_gcd(int a, int b) { if(b == 0) { x = 1; y = ... 阅读全文
posted @ 2012-08-03 22:01 时光旅行的懒猫 阅读(267) 评论(0) 推荐(0) 编辑
摘要: long long merge_sort(int l, int r) { int mid, p, q, i, j, len; if(l >= r) return 0; mid = (l + r) >> 1; len = r - l + 1; p = l; q = mid + 1; j = l; for(i = 0; i < len; ++i) { if((q > r) || (num[p] < num[q] && p <= mid)) { t[j++] = num[p++]; } else { ... 阅读全文
posted @ 2012-08-03 21:57 时光旅行的懒猫 阅读(182) 评论(0) 推荐(0) 编辑
摘要: 下图说的很清楚,每次找入度为0的点,将其从序列中删掉,同时与它相连的所有点入度减一;实现代码,以HUD_1285为例:#include <iostream>#include <cstdio>using namespace std;const int N = 501;int map[N][N];int into[N], ans[N];void toposort(int x){ int i, j, k; for(i = 1; i <= x; i++) for(j = 1; j <= x; j++) if(map[i][j]) ... 阅读全文
posted @ 2012-08-03 21:56 时光旅行的懒猫 阅读(197) 评论(0) 推荐(0) 编辑
摘要: 并查集(Union-Find Sets),字面意思理解——合并,查找。给出一个集合,将其合并后用一个点代替一个集合的元素。例如:1 22 34 3合并后就是 2 / \1 3 \ 4主要操作:1、查找。2、合并。查找方法见http://www.cnblogs.com/vongang/archive/2011/07/31/2122763.html合并实现方法如下:void Union(int root1, int root2){ int x = FindSet(root1), y = FindSet(root2); if( x == y ) return ; if( r... 阅读全文
posted @ 2012-08-03 21:55 时光旅行的懒猫 阅读(139) 评论(0) 推荐(0) 编辑
摘要: struct node{ int v; //边的结束顶点int w; //边的长度 node* next; //指向以同一起点的下一条边的指针}*first[N]; //first[u]指向以u为起始点的第一条边void init(){ memset(first,NULL,sizeof(first));}void add(int u, int v, int w)//添加边{ node* p =new node; p->v = v; p->w = w; p->next = fisrt; first[u] = p;}//使用的时候,找u的邻接点for(node* p... 阅读全文
posted @ 2012-08-03 21:53 时光旅行的懒猫 阅读(242) 评论(0) 推荐(0) 编辑
摘要: 当对很大的数(比如100位)进行运算时,肯定不能c/c++内的数据类型直接运算(当然Java里的BigNumber可以。。。)这时就要用数组模拟运算过程。+, - ,*, /,运算貌似是小学学的东西,童鞋们,现在要用到小学的知识啦!!先说加法,大体的操作包括逆序、对位、求和、进位(其实就是小学的加法运算,不过是把数倒过来算,至于为什么要逆序。。。)例题:http://poj.grids.cn/practice/2981代码:#include <stdio.h>#include <string.h>#define MAX 200int an1[MAX+10];int an 阅读全文
posted @ 2012-08-03 21:51 时光旅行的懒猫 阅读(188) 评论(0) 推荐(0) 编辑
摘要: 堆排序 堆排序是利用堆的性质进行的一种选择排序。下面先讨论一下堆。1.堆堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者Key[i]>=Key[2i+1]&&key>=key[2i+2] 即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。 堆分为大顶堆和小顶堆,满足Key[i]>=Key[2i+1]&&key>=key[2i+2]称为大顶堆,满足 Key[i]<=key[2i+1]&&Key[i 阅读全文
posted @ 2012-08-03 21:47 时光旅行的懒猫 阅读(185) 评论(0) 推荐(0) 编辑
摘要: 快排过程很简单,就是一个二分的思想,过程如下(从小到大为例):1、取一个关键字;2、把序列中大于关键字的放在关键字右边;3、把序列中小于关键字的放在关键字左边;4、重复1-3步,直到序列有序;代码+注释:#include<stdio.h>#define N 100int QuickSort1 (int r[], int low, int high){ int key; key=r[low]; /*取轴值记录关键字*/ while(low<high) /*从表的两端交替地向中间扫描*/ { while(low<high && r[high]... 阅读全文
posted @ 2012-08-03 21:42 时光旅行的懒猫 阅读(269) 评论(0) 推荐(0) 编辑
摘要: 二叉排序数的(递归)定义:1、若左子树非空,则左子树所有节点的值均小于它的根节点;2、若右子树非空,则右子树所有节点的值均大于于它的根节点;3、左右子树也分别为二叉排序树。如图:链表实现(比较简单):View Code #include <stdio.h>#include <malloc.h>typedef struct node{ int data; struct node * lchild; struct node * rchild;}node;void Init(node *t){ t = NULL;}node * Insert(node *t , int key 阅读全文
posted @ 2012-08-03 21:39 时光旅行的懒猫 阅读(11071) 评论(0) 推荐(1) 编辑
摘要: 栈和队列都是最基础的数据结构,栈的思想是“先进后出”,队列的思想是“先进先出”。怎么说呢,栈和队列其实都是对于单链表或者数组的一些特殊操作。在后边很多算法中经常用到(比如BFS, SPFA。。。)栈主要操作有:入栈Push;取栈顶Get_Top;出栈(删除栈顶元素)Pop;栈的数组实现(代码非常简单,关键是思想)://数组实现#include <stdio.h>#include <malloc.h>#define maxsize 10typedef struct{ int data[maxsize]; int top; int base;}seqstack;seqsta 阅读全文
posted @ 2012-08-03 21:36 时光旅行的懒猫 阅读(359) 评论(0) 推荐(0) 编辑
摘要: 题目链接http://poj.org/problem?id=1061扩展欧几里得+线性同余方程从题意中很容易得到等式x+mt = y+nt(mod L)//t代表时间移动左右得到 (m-n)t = y-x(mod L);所以 得到(m-n)*a - L*b = y-x的扩展欧几里得,求解a,套上模版就OK了。View Code 1 #include <stdio.h> 2 #include <string.h> 3 __int64 x,y; 4 __int64 ext_eucld(__int64 a,__int64 b) 5 { 6 __int64 t,d; 7 if( 阅读全文
posted @ 2012-08-03 21:23 时光旅行的懒猫 阅读(234) 评论(0) 推荐(0) 编辑
摘要: 题目链接http://poj.org/problem?id=1942题意 输入边长 有多少种走法思路 组合数模板View Code 1 #include<stdio.h> 2 int main() 3 { 4 __int64 n,m,s,t,i,sum; 5 while(~scanf("%I64d%I64d",&n,&m)) 6 { 7 if(n==0&&m==0) 8 { 9 break;10 }11 if(n>m)12 s=m;13 else14... 阅读全文
posted @ 2012-08-03 21:21 时光旅行的懒猫 阅读(169) 评论(0) 推荐(0) 编辑
摘要: 题目链接http://poj.org/problem?id=2115拓展欧几里得算法+线性同余方程题目大意是问A经过多少次能到达B, 当A的值大于 2^k时 A = A%2^k;从题目中可以得到方程: a + c*x = b (mod 2^k) 变形得 c*x = (b-a) (mod 2^k); 再变形得: c*x – 2^k*y = (b – a)解扩展欧几里德方程就可以了View Code 1 #include<iostream> 2 #include<stdio.h> 3 using namespace std; 4 __int64 ext_gct(__int6 阅读全文
posted @ 2012-08-03 21:14 时光旅行的懒猫 阅读(242) 评论(0) 推荐(0) 编辑
摘要: 思路 从网上拿的。。。先输入N表示有N头牛,接下来的N个数是各个牛所在的位置。如果一头牛对另一头牛Moo,那么Moo数就是1号牛所在位置i与2号牛所在位置j的差值,又因为1号牛Moo过去,所以2号牛也要Moo回来,于是Moo数就变为2倍了。1号牛要对剩余所有(N-1)头牛都Moo,如果我们将牛按顺序排好,每头牛i只对它身后的(N-i)头牛Moo,意思是,我们只考虑某头牛Moo出去的,而不考虑别的牛对它Moo回来的,那么它也不对在它前面的牛Moo,那么这就是一个简单的数学问题,每头牛i只对身后的(N-i)头牛Moo。因为所有牛还要Moo回去,所以最后结果乘2就可以了。这就想到可以用循环来实现,对 阅读全文
posted @ 2012-08-03 21:06 时光旅行的懒猫 阅读(540) 评论(2) 推荐(0) 编辑
摘要: 题目链接http://poj.org/problem?id=3461题目大意 以A为子串,查找B中有几个A。思路。KMP算法View Code 1 #include<stdio.h> 2 #include<string.h> 3 #define N 1000001 4 int nextt[N]; 5 char str1[N],str2[N]; 6 void next(char s[]) 7 { 8 int i=1,j=0; 9 int len=strlen(s);10 nextt[0]=-1;11 while(i<len)12 {13 ... 阅读全文
posted @ 2012-08-03 21:02 时光旅行的懒猫 阅读(178) 评论(0) 推荐(0) 编辑
摘要: 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2094图论 拓扑排序 不过难点是输入的是字符 用STL mapView Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<map> 5 using namespace std; 6 map<string,int>p; 7 int o[2001][2001],key[2001]; 8 char str1[100],str2[100]; 9 in 阅读全文
posted @ 2012-08-03 20:52 时光旅行的懒猫 阅读(198) 评论(0) 推荐(0) 编辑
摘要: 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1285图论 最简单的拓扑排序 寻找入度为0的点删掉 然后让跟它相连的点入度减一View Code 1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 int map[501][501],topp[501],inde[501]; 5 void toppsort(int n) 6 { 7 int i,j,k; 8 for(i=1;i<=n;i++) 9 {10 for(j=1;j<= 阅读全文
posted @ 2012-08-03 20:48 时光旅行的懒猫 阅读(157) 评论(0) 推荐(0) 编辑
摘要: 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1905题意:给一个 p 和 一个 a,如果这个p 本身就是一个素数,就输出 no,如果不是素数,那么计算( a ^ p) % p 如果结果等于 a 那么输出 yes 否则输出 no也就是伪素数。View Code 1 #include<stdio.h> 2 #include<math.h> 3 __int64 jud(__int64 n) 4 { 5 __int64 i; 6 for(i=2;i*i<n;i++) 7 if(n%i==0) 8 retu... 阅读全文
posted @ 2012-08-03 20:37 时光旅行的懒猫 阅读(422) 评论(0) 推荐(0) 编辑
摘要: 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2035快速幂取模板View Code 1 #include <stdio.h> 2 #include <stdlib.h> 3 int main() 4 { 5 int a,b,cj,jg,i; 6 while(~scanf("%d %d",&a,&b)) 7 { 8 9 if(a==0&&b==0)10 break;11 if(b==0)12 {13 printf("1\n");14 ... 阅读全文
posted @ 2012-08-03 20:32 时光旅行的懒猫 阅读(257) 评论(0) 推荐(0) 编辑
摘要: 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2503View Code 1 #include<stdio.h> 2 #include<string.h> 3 __int64 gcd(__int64 a,__int64 b) 4 { 5 return b==0?a:gcd(b,a%b); 6 } 7 int main() 8 { 9 __int64 n,a,b,c,d,t,k,m;10 scanf("%I64d",&n);11 while(n--)12 {13 scanf("%I64d% 阅读全文
posted @ 2012-08-03 20:19 时光旅行的懒猫 阅读(227) 评论(0) 推荐(0) 编辑