常用模板
文章平均质量分 77
AC_Gibson
这个作者很懒,什么都没留下…
展开
-
POJ3414 Pots BFS
题目大意:给出两个容量分别为V1,V2的瓶子,和目标水量C,瓶子可以进行如下3种操作:(1)FILL( i ):将第i个瓶子装满水(i=1,2);(2)DROP( i ):将第i个瓶子里的水全部到出(i=1,2);(3)POUR( i,j):将第i个瓶子的水倒入第j个瓶子中(或将i中的水全部倒入j中,或将i中的一部分水倒入j中的时候j已经装满)。现在问你经过多少次操作能使其中一个瓶原创 2015-04-15 14:18:19 · 461 阅读 · 0 评论 -
Miller-Rabin素数测试
如果要判断一个比较大的数是否为素数,那么此时传统的试除法和筛法显然不再适用,我们引入一种概率型素数判定方法——Miller-Rabin素数测试。 由费马小定理可以知道,若n是素数且a是整数,则满足a^n≡a(mod n).若存在a不满足上式,那么n是合数。由此我们定义伪素数:令a是一正整数,若n是合数且满足a^n≡a(mod n),那么n称为以a为基的伪素数。 Miller-R原创 2015-07-03 15:54:19 · 3004 阅读 · 0 评论 -
Pollard-rho大整数分解
首先低于一般范围的整数分解,我们可以打一个素数表然后用试除的方法对其进行质因子分解。 具体实现代码如下:#include #include #include using namespace std;#define N 65555bool p[N];int prime[N],num=0;void init(){ memset(p,true,sizeof(p));原创 2015-07-06 11:10:25 · 3401 阅读 · 0 评论 -
HDU1392 Surround the Trees 简单凸包
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1392题目大意:平面上有n个点代表n棵树,现在要把这些树用绳子围起来,求最少需要的绳子长度。分析:简单求凸包问题。实现代码如下:#include #include #include #include using namespace std;typ原创 2015-08-10 09:46:55 · 490 阅读 · 0 评论 -
POJ3264 Balanced Lineup 线段树||RMQ
题目链接:http://poj.org/problem?id=3264题目大意:给出一个序列,Q次查询,每次查询找出该区间内最大值和最小值的差。分析:线段树和RMQ都可以。线段树实现代码如下(2412K,2188MS):#include #include #include using namespace std;const int maxn=5000原创 2015-08-24 09:45:21 · 447 阅读 · 0 评论 -
整除23以内的数的特殊性质
在ACM竞赛中我们有时会遇到整除取模的问题,对于整除问题,我们有下列性质:(1)1与0的特性: 1是任何整数的约数,即对于任何整数a,总有1|a. 0是任何非零整数的倍数,a≠0,a为整数,则a|0. (2)若一个整数的末位是0、2、4、6或8,则这个数能被2整除。(3)若一个整数的数字和能被3整除,则这个整数能被3整除。 (4) 若一个整数的末尾两位数能被4整除,则原创 2015-08-13 09:22:50 · 807 阅读 · 0 评论 -
HDU4109 Instrction Arrangement 拓扑排序求关键路径
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4109题目大意:有n条指令和m条指令之间的依赖关系,对于每一组关系u v w表示指令v必须在指令u之后w执行,且执行需要w个时间单位,问你要执行n条指令最少需要消耗的时间(多条无依赖关系的指令可同时执行)分析:裸的关键路径。实现代码如下:#include #in原创 2015-08-13 12:08:52 · 725 阅读 · 0 评论 -
POJ3468 A Simple Problem with Integers 线段树成段更新(lazy)
题目连接:http://poj.org/problem?id=3468题目大意:给出一个100000的序列,进行100000次操作,操作"C l r v"表示将区间[l,r]内的所有元素的值加上v;操作"Q l r"表示查询区间[l,r]的元素的和。实现代码如下://线段树成段更新:每次更新一个区间[l,r]#include using namespace std;原创 2015-05-14 09:30:02 · 551 阅读 · 0 评论 -
欧拉路AND欧拉回路
定义:对于无孤立节点图G,若存在一条路经过图中每一条边且只经过一次,该条路称为欧拉路。若该路径为一个圈,则称为欧拉回路 欧拉路的判定: (1)一个无向图存在欧拉路径,当且仅当该图是连通的,且只存在零个或两个奇数度的顶点。 (2)一个有向图存在欧拉路径,当且仅当该图是连通的,且该图的所有顶点度数为0,或仅存在一个度数为1的顶点和一个度数为-1的顶点,其余点的度数原创 2015-08-15 21:06:10 · 564 阅读 · 0 评论 -
POJ2528 Mayor's posters 线段树区间更新+离散化
题目链接:http://poj.org/problem?id=2528题目大意:一个长度为10^7的墙上有n张海报,可能相互重叠,告诉你每张海报的宽度(高度都一样)和先后的叠放次序,问没有被完全盖住的海报有多少张(海报端点不会落在瓷砖中间)。分析:如果每个叶子节点都代表一块瓷砖,那么线段树会导致MLE,即单位区间的数目太多。实际上,由于最多有1W张海报,共计2W个端点,这些原创 2015-09-07 18:26:06 · 477 阅读 · 0 评论 -
HDU1042 N! 高精度:计算n!精确值
求n!的精确值。可以直接模拟乘法操作,记录每位的值,这种方法耗时比较多。实现代码如下(1236MS)://by Ibsen#include #include using namespace std;#define MAX 10000000int a[MAX];//存数运算结果int main(){ int n; while(scanf("%d",&原创 2014-09-11 10:30:31 · 677 阅读 · 0 评论 -
高精度除法与求余C++版和java版
高精度除法与求余c++版(除数与被除数100000位):代码如下://高精度除法与求余#include#include#includeusing namespace std;const int M=1e5+5;char s[M],result[M];int main(){ long long mod,divis; int n,i,k,flag,le原创 2015-10-23 08:57:18 · 1750 阅读 · 0 评论 -
高精度加法(可以为负数)【C++版和java版】
高精度加法:两个整数相加:#include #include using namespace std;const int MAX=1001;void big_add(char a[],char b[],char c[]){ int i,e=0,d; int len1=strlen(a); int len2=strlen(b); for(i=原创 2014-08-05 11:51:34 · 3012 阅读 · 0 评论 -
java高精度开平方
import java.util.*;import java.math.*;public class Main{ public static void main(String[] args) { Scanner cin=new Scanner(System.in); int t=cin.nextInt原创 2015-10-23 09:26:42 · 1243 阅读 · 0 评论 -
高精度乘法 【C++版(简单模拟版和FFT快速版)和java版】
高精度乘法C++版简单模拟版(N^2复杂度):#include #include #include #include using namespace std;const int MAX=50001;char sa[MAX],sb[MAX],ssum[2*MAX];int lsum;void bigchenfa(char sa[],char sb[]){ i原创 2014-09-26 17:15:12 · 1955 阅读 · 0 评论 -
HDU1166 敌兵布阵 线段树区间求和||树状数组
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166线段树实现代码如下://线段树区间求和#include #include #include #include #include using namespace std;#define maxn 50005int num[maxn];struct se原创 2015-05-13 14:07:16 · 524 阅读 · 0 评论 -
HDU3584 Cube 三维树状数组
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3584题目大意:给定一个N* N* N多维数据集A,其元素是0或1。A[I,j,k]代表集合中中的第i行,第j列与第k层的值。首先,我们有A [i,j,k]= 0(1我们定义了两个操作,1:“Not”,我们改变A [i,j,k]=!A [i,j,k]的操作。这意味着我们改变A[i,j,k原创 2015-10-11 21:40:57 · 504 阅读 · 0 评论 -
POJ3233 Matrix Power Series 矩阵快速幂+二分求和
在看矩阵快速幂求和之前,我们先来看一下等比数列Sn=(a+a^2+a^3+...+a^n)mod M的求和取模:实现代码如下:#include #include #include using namespace std;typedef long long LL;const int M=10000009;LL power(LL a,LL b){ LL ans =原创 2015-06-09 16:10:29 · 936 阅读 · 0 评论 -
学习资料汇总(网址汇总)
本帖持续更新中....发现比较不错的就贴过来了(1)http://classfoo.com 语言资料库 里面很多东西挺不错的,没事可以去看看,推荐几个个人认为比较不错的: 算法库:http://classfoo.com/ccby/article/tZTzs std::vector: http://classfoo.com/ccby/article/jn原创 2014-11-21 14:07:50 · 1290 阅读 · 0 评论 -
大数斐波那契取模模板
大数斐波那契取模:#include #include #include using namespace std;const int mod=19999997;typedef struct{ long long m[2][2];}matrix;matrix I={1,0,0,1};matrix P={0,1,1,1};matrix mul(matrix a,matri原创 2015-04-17 16:42:41 · 1651 阅读 · 0 评论 -
POJ2778 DNA Sequence AC自动机+矩阵连乘
题目大意:某些特定的DNA片段被认为是携带遗传病的序列,现在给出m个带有遗传病的DNA序列,让找出有多少种长度为n的DNA序列不包含任何的遗传病。分析:首先,我们知道,对于一个图G的邻接矩阵matrix[ i ][ j ]来说,其值表示的是从节点i走到节点j走一步有多少种不同的走法;对于matrix^2 [ i ][ j ]来说,表示是从节点i到节点j走两步一共有多少种不同的走原创 2015-05-09 12:20:37 · 461 阅读 · 0 评论 -
Tire树(字典树)的基本操作
Tire树的基本原理: Tire树是一种树形结构,因其是词典的一种存储方式,故又叫字典树。词典中的每一个单词在tire树中表现为一条从根结点出发的路径,路径边上的点连起来就是一颗tire树,如右图:其中含有ab,abc,bac,bbc,ca五个单词。 Tire树的基本性质可以归纳为:(1)根结点不包含字符,其他的每一个节点只包含一个字符;(2)从根结点到原创 2015-04-29 13:20:21 · 5516 阅读 · 2 评论 -
单源最短路径:bellman-ford算法和SPFA算法
前面讲了单源最短路径的Dijkstra算法和任意两点间最短路径的Floyd算法,今天我们来看一下求单源最短路径的另外两种常用的算法:bellman-ford算法和SPFA算法。至于为什么要把这两个放在一起呢,比较SPFA算法是对bellman-ford算法的改进和优化。 我们先来看一下bellman-ford算法:其实bellman-ford算法和Dijkstra算法是有相似之处原创 2015-03-29 17:22:16 · 1067 阅读 · 0 评论 -
HDU1754 I Hate It 线段树区间最值
题目链接:点击打开链接//线段树区间最值#include #include #include #include #include using namespace std;#define maxn 200005int num[maxn]; //纪录每个学生的成绩struct segmentree{ int l; //左端点 int r; //右端点原创 2015-05-13 15:34:48 · 633 阅读 · 0 评论 -
HDU2222 Keywords Search AC自动机
/*题目大意:给你n个关键字和一个模式串,让你找出模式串中有多少个关键字分析:AC自动机入门题。可以作为AC自动机的模板*/#include #include #include #include using namespace std;#define son_num 26#define maxn 1000005char str0[maxn];struct node{原创 2015-05-06 17:42:21 · 515 阅读 · 0 评论 -
POJ1305 Fermat vs. Pythagoras 本原毕达哥拉斯三元组求解
题目链接:http://poj.org/problem?id=1305题目大意:给定一个正整数n,让找出[1,n]内的本原毕达哥拉斯三元组的组数,以及这些三元组都不涉及的数的个数。分析:首先我们知道毕达哥拉斯三元组其实就是勾股定理x^2+y^=z^2中的三个数(x,y,z),如果满足gcd(x,y,z)=1,那么这个毕达哥拉斯三元组就是本原的。我们有以下原创 2015-06-17 13:02:34 · 1059 阅读 · 0 评论 -
Lucas定理应用分析——大组合数取模
首先给出Lucas(卢卡斯)定理: 有非负整数A、B,和素数p,A、B写成p进制:A=a[n]a[n-1]...a[0],B=b[n]b[n-1]...b[0]。则组合数C(A,B)与C(a[n],b[n])×C(a[n-1],b[n-1])×...×C(a[0],b[0]) mod p同余。即:Lucas(n,m,p)=C(n%p,m%p)×Lucas(n/p,m/p,p) ,原创 2015-05-29 12:36:58 · 1914 阅读 · 1 评论 -
素数筛选
关于素数筛选,ACM中常用的有两种方法:埃拉托色尼(Eratosthenes)筛法( 复杂度为O( nloglogn ) )和快速筛选法(也叫线性筛法,复杂度为O(n))。 先说第一种筛法://埃拉托色尼(Eratosthenes)筛选法:#define N 10000bool prime[N]; //纪录N以内的素数int p[N]; //p[i]是第i个素数int k原创 2015-05-22 09:02:33 · 477 阅读 · 0 评论 -
HDU5251 矩形面积 凸包-矩形覆盖
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5251分析:凸包-矩形覆盖。找出最小的矩形,使其覆盖已知的所有矩形。实现代码如下:#include#include#include#includeusing namespace std;#define PR 1e-8#define N 4010#define m原创 2015-06-03 20:57:19 · 861 阅读 · 0 评论 -
扩展欧几里得应用分析
原理推导: 首先我们定义:设a和b不全为0,则存在整数x和y,使得gcd(a,b)=ax+by。这就是扩展欧几里得的算法描述。 扩展欧几里得算法是用来求解二元一次方程。对于方程Ax+By=C,其中A,B,C为整数,求出满足等式的整数x和y。考虑到给出的方程不一定是最简形式,所以我们需要先化为最简式,设d=gcd(A,B),那么化简后的方程为:ax+by=c,其中a=A/d,b=原创 2015-06-03 16:10:51 · 719 阅读 · 0 评论 -
POJ2891 Strange Way to Express Integers 一元线性同余方程组
题目连接:http://poj.org/problem?id=2891题目大意:有一种表示非负整数的方法:选择k个不同的正整数a1,a2,...,ak,对于某个整数m分别对ai求余,对应余数为ri,如果只当选择a1,a2,...,ak,那么整数m可有整数对(ai,ri)唯一表示。现在已知整数对(ai,ri),让确定出整数m.分析:典型的解同余方程组的题。原创 2015-06-05 11:25:38 · 608 阅读 · 0 评论 -
线性同余方程初步应用分析
一元线性同余方程定义:a,b是整数,m是正整数,形如ax≡b(mod m),且x是未知整数的同余式称为一元线性同余方程。定理:a,b,m是整数且m>0,gcd(a,m)=d,如果d|b,则方程恰有d个模m不同余的解,否则方程无解。由同余方程式的定义可知:ax+my=b(y为整数),这个方程称为二元一次不定方程。(1)解一元线性同余方程设d=gcd(a,m),由定理可知若原创 2015-06-05 10:16:26 · 2226 阅读 · 0 评论 -
佩尔方程求解问题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3292题目大意:讲述的是滥竽充数的故事。有一个乐队,可以站成一个边长为x的正方形,也可以减去一个人,然后站成若干个边长为y的正方形,很明显乐队人数不是唯一的,现在让你找出第k大的乐队人数。分析:根据题意可以提炼出二元不定方程x^2-D*y^2=1,典型的佩尔方程。首先我们知道,若原创 2015-06-26 09:49:25 · 4298 阅读 · 1 评论 -
POJ3243 Clever Y 解 高次同余方程
解高次同余方程A^x≡B(mod C)算法流程S1:i从0到100循环,如果满足A^i≡B(mod C),那么i就为所求,否则继续S2;S2:令d=0,D=1,执行如下循环:while((tmp=gcd(A,C))!=1) { if(B%tmp) return -1; //无解 ++d; C/=tmp; B/=tm原创 2015-06-08 13:21:22 · 1239 阅读 · 0 评论 -
POJ2417 Discrete Logging 解高次同余方程
题目链接:http://poj.org/problem?id=2417实现代码如下:(一)#include #include #include #include using namespace std;//baby_step giant_step// a^x = b (mod n) n为素数,a,b < n// 求解上式 0<=x < n的解#defin原创 2015-06-08 13:35:22 · 596 阅读 · 0 评论 -
常用排序汇总
常用排序有:1.插入排序(直接插入排序,折半插入排序,希尔排序)2.交换排序(冒泡排序,快速排序)3.选择排序(直接选择排序,堆排序)4.归并排序5.基数排序/*Author:IbsenData:2015.12.21*///排序汇总(插入排序(3种),交换排序(2种),选择排序(2种))#include using namespace std;in原创 2015-12-21 14:22:25 · 1094 阅读 · 0 评论