- 博客(114)
- 收藏
- 关注
原创 The Settlers of Catan(uva539简单的回溯)
题意:求无向图的最长链,点可以重复,边不可以重复思路:暴力解决每个点都有可能变成起始点,所以用每个点都暴力找到每个点的所有能走的路,用visit[i][j]保存走过的边,如果边没走过,就走,否则就不走邻接矩阵简历表,发现有边可以走,就走过去从该点开始往下遍历#include#include#include#includeusing namespace std;int m
2013-11-28 09:16:51
818
原创 Babelfish(poj2503字符串处理)
题意:给你每个单词对应的意思,再输入一个单词,说出他的意思,如果单词不存在输出eh思路:hash表保存单词,用另一个单词当做键值,实现快速查找#include#include#include#includeusing namespace std;struct str{ char s[12]; char s_str[12];}Node;vector v[10
2013-11-26 16:57:59
930
原创 Birthday Cake (uva10167简单暴力枚举)
题意:有一个半径100,圆形(0,0)的蛋糕,上面有很多樱桃,有一对双胞胎要平分蛋糕,并且平分上面的樱桃,问你切的那刀的直线的Ax+By = 0的A,B是多少范围都在[-500,500]思路:因为范围在[-500,500],所以枚举A,B,统计在直线上面的和在直线下面的樱桃,把樱桃的坐标带入,如果>0说明在直线的上方,#include#include#include#includ
2013-11-01 18:49:20
875
原创 计算直线的交点数(hdu1466简单的dp)
题意:平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数。比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行)。思路:动态规划,想办法记忆化搜索,当前状态和之前状态结合起来dp[i][j] i是有i条直线 j代表交点个数假设有n条直线,前n-1条直线的所有交点都知道假设第n条线段与前n-1条平行 n条平行 交点数 0假设第n条线段与前n-2条平行
2013-10-29 21:07:03
877
原创 Chinese remainder theorem again(hdu1788中国剩余定理)
题意:一个正整数N除以M1余(M1 - a),除以M2余(M2-a), 除以M3余(M3-a),总之, 除以MI余(MI-a),其中(a思路:化简式子N = M1-a mod M1N = M2-a mod M2N = m3-a mod M3写成 N + k1*M1 = M1 -a --> N+ k1*M1 +a = M1 也就是N + k1*M1 +a = 0 mod M1
2013-10-27 11:34:39
899
原创 Biorhythms(poj1006中国剩余定理)
题意:三个高峰周期分别为23,28,33,给你一个d这一年过了几天,p,e,i表示前一次三个高峰距d过了多少天,求三个高峰在d之后的第几天出现思路:中国剩余定理 :http://blog.csdn.net/leonharetd/article/details/13167615根据题意列同与方程d = p mod 23d = e mod 28d = i mod 33解同余方程
2013-10-27 11:07:54
805
原创 中国剩余定理
若m1,m2,m3,m4.....mr是两两觳觫的正整数,则同与方程x = a1 ( mod m1)x = a2 ( mod m2)x = a3 ( mod m3)..............................x = ar ( mod mr)有模M = m1*m2*m3*.....mr的位移解,即为中国剩余定理在《孙子算经》中有这样一个问题
2013-10-27 10:26:29
1316
2
原创 Raising Modulo Numbers(poj1995快速模运算)
题意:(A1B1+A2B2+ ... +AHBH)mod M.思路:快速幂算出每一个,然后加在一起,这里快速幂最好不要用递归,容易爆,还是二进制思想吧#include#include#include#includeusing namespace std;typedef long long int64;int64 quick_mod(int64 a,int64 n,i
2013-10-27 09:14:23
817
原创 Matrix Power Series(poj3233快速幂+矩阵二分幂+分治)
题意:给定一个n*n的矩阵和一个整数k,计算 S = A +A^2 +A^3 + .....+ A^k思路:不能暴力,会超时的所以我们要想一个办法化简,对于原式可以提取公因式 S = A +A^2 +A^3 + .....+ A^k/2 + A^k/2 * (A +A^2 +A^3 + .....+ A^k/2)这样我们就可以只算A到A^k/2,同理这之间也可以用刚才的方法不停地二
2013-10-27 09:02:45
803
原创 Mod Tree(hdu2815高次线性同余方程)
题意:求每个节点有K个儿子,计算最小深度D的节点数对P取模的结果是N,K^D = N( mod P )的最小D值 如果无解输出 Orz,I can’t find D!思路:baby__giant算法分两种情况第一种 : 当A 和C互质的时候m = sqrt(C);A^x = A^i*m+j = B (mod C)A^i*m*A^j = B ( mod C)两边除以A^i
2013-10-26 21:49:40
965
原创 A/B(hdu1576 乘法逆元)
题意:要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1)。思路:求乘法逆元满足a*k≡1 (mod p)的k值就是a关于p的乘法逆元。当且仅当gcd(k,p) = 1,如果可逆则可定义除法 x/k = x * a mod p 为什么要有乘法逆元呢?当我们要求(a/b) m
2013-10-26 17:18:16
1303
原创 Hello Kiki(hdu3579线性同与方程)
题意:X = Ai (mod Mi) 给你Ai和Mi 计算最小正整数x,最小正整数解不能是0,如果为0那么解就是n个Ai的最小公倍数思路:线性同余方程组线性同余方程组解法:http://blog.csdn.net/leonharetd/article/details/13090883#include#include#include#includeusing namespac
2013-10-26 15:13:43
702
原创 X问题(hdu1573线性同余方程)
题意:求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2], …, X mod a[i] = b[i], … (0 思路:解线性同余方程组求出满足上面等式最小的x是多少,因为他们的通解为 x+ lcm(a0,a1,a2,a3...an),所以求出最小的解,计算M-x之间有多少个 lcm(a0,a1
2013-10-26 14:53:46
788
原创 C Looooops(poj2115线性同余方程)
题意:A + nC = B (mod 1 思路典型的线性同余方程不知道怎么解的看这里:线性方程求解 http://blog.csdn.net/leonharetd/article/details/13090883#include#include#include#includeusing namespace std;typedef long long int64;
2013-10-26 14:37:27
897
原创 Strange Way to Express Integers(poj2891线性同余方程组)
题意:n = ai( mod ri) 给你 n 个 ai 和 ri 求最小满足的n,如果没有解则输出-1思路:典型的解线性同余方程组x = a1 (mod r1)x = a2 (mod r2)n1*r1 + a1 = n2*r2 + a2n1*r1 - n2*r1 = a2 - a1;用扩展欧几里德算出方程的解xi,再得出x等于 xs = xi * r1 + a1
2013-10-26 13:17:44
822
原创 线性同余方程
一元线性同余方程定义:a,b是整数,m是正整数,形如 a*x = b (mod m) 且x是未知整数的同余式称为一元线性同余定理:a,b,m 是整数且m > 0 (a,m) = d,如果d | b,则方程恰有d个模不同余的解,否则方程无解 如 a/d = b/d (mod m/d) 乘以d--> a = b (mod m/d) b一定要是d的倍数方程才有结由同余方程的定义可得 a*
2013-10-26 11:37:52
2138
原创 Reduced ID Numbers(poj2769同余定理)
题意:给你一组n个数,找到最小的正整数m,是的当前组内的所有树对m取模均不同余思路:对当前组枚举除数1.想要都不相同,枚举是从n开始枚举不是从1开始,鸽巢原理小于n个必有相同的2.memset初始化的时候,用多少初始化多少,memset(a,0,sizeof(int)*(n+1)),直接sizeof(a)会超时#include#include#include#includ
2013-10-21 21:48:30
798
原创 同余概述
数学上,两个整数除以同一个整数,若得相同余数,则二整数同余(英文:Modular arithmetic;德文:Kongruenz)。同余理论常被用于数论中。最先引用同余的概念与符号者为德国数学家高斯。同余同余理论是初等数论的重要组成部分,是研究整数问题的重要工具之一,利用同余来论证某些整除性的问题是很简便的.同余是数学竞赛的重要组成部分.两个整数a,b,若它们除以整
2013-10-21 21:42:18
1118
1
原创 梅森素数(nefu120)
题意:给你一个p,判断Mp是否是梅森素数如果是输出也是,如果不是输出no思路:Miller测试判断素数,先算出2^p-1在判断a^(2^p-1-1) 模 2^p余数是否为1.这道题乘法平方会溢出,所以必须把乘法变成加法#include#include#include#include#include#includeusing namespace std;typedef
2013-10-21 21:31:06
822
原创 梅森素数
梅森素数是指形如2^p-1的正整数,其中指数p是素数,常记为Mp 。若Mp是素数,则称为梅森素数。p=2,3,5,7时,Mp都是素数,但M11=2047=23×89不是素数 梅森数可能是素数也可能是合数,因此如何对梅森数进行判断是一个很关键的问题根据费马定理 如果n是素数,有 a^(n-1) = 1 ( mod n) 1 一个数可能通过Miller测试,但他可能不是素数,庆幸的是,这样
2013-10-21 21:25:31
1582
原创 Prime Distance(poj2689变形的筛法素数)
题意:给你一个区间L,U计算这个区间里面的间距最大的连续素数和最小的连续素数1思路:L,U的范围太大了无法使用普通的筛法,将所有素数全部筛完,但是因为它是L,U的一个区间,长度不超过10^6,那可以筛出这个区间的所有素数,然后再求最大最小间距怎么求L,U区间的素数呢?我们可以先看1关键是怎么确定开始的L开始的2,3,5....的倍数,这时我们可以用 整数的强制转换 L / prim
2013-10-17 21:51:53
897
原创 埃拉托斯尼丝筛法
埃拉托斯尼丝筛法:先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。long long
2013-10-17 21:26:59
1099
原创 数论———素数测试
检查一个正整数是否是素数称作素数测试。基本素数判别法:正整数n是素数,当且仅当它不能被任何一个小于根号n的素数整除埃拉托斯尼斯筛法:先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数
2013-10-17 20:55:55
853
原创 nefu117素数定理
题意:给你一个n,计算1~10^n次方之间有多少个素数,输出该数的位数。思路:素数定理,小于一个正整数x的素数有多少个,在n越来越大,接近 n / log(n) 计算机用log表示以e为底的对数所以只要先算出 n / log(n) 在取log 就是位数n = 10^nlog10( n / log(n) ) = log10(10^n) - log10(log(10^n)) = n -
2013-10-17 20:38:05
902
原创 Area(poj1654多边形面积)
题意:原点开始给你一个路径,路径有可能闭合,有可能不闭合,求其围成的面积。思路:模拟路径的走法,叉积求有向面积#include#include#include#include#include#includeusing namespace std;struct Point{ int x,y; Point(int x,int y) : x(x),y(y){
2013-10-09 20:31:45
625
原创 Cows(poj3348凸包的面积)
题意:给你一些点,这些点圈起来一个牧场,每50平方米可以放一头牛,问这些点圈起来的牧场放的牛的数量思路:求凸包的面积然后/50再向下取整#include#include#include#include#include#includeusing namespace std;struct Point{ double x,y; double v,L; Point(do
2013-10-09 20:27:59
691
原创 Grandpa's Estate(poj1228稳定的凸包)
题意:给你一个凸包的所有的点,求看其是否能组成唯一的凸包思路:组成唯一的凸包,那么他的每一条边至少有三个点,因为如果有有两个点,那么可以再加一个点使得凸包扩大,所以每条边至少三个点。这就和以前组成的凸包不太一样的,以前组凸包有可能没有考虑其边界上有点,因为这对面积没有什么影响,但是这题有影响,所以再求凸包的时候不能要边界上的点,等于说是求得了真正的凸包,每条边只有两个端点,然后枚举每条线段
2013-10-09 20:23:35
1026
原创 The Fortified Forest(poj1873位运算枚举+凸包)
题意:给你一些树的坐标,价值和砍掉每棵树所能做成的篱笆长度,求出砍掉最小价值的树,然后砍掉的树能做成篱笆,能把剩下的树围起来,并求出围成以后剩余的长度思路:因为最多15棵树,用位运算枚举每个状态一共2^15-1个状态,都用01表示假如有3棵树那么所有的状态为0~7,也就是000~111代表每一棵树是否被砍掉,每取一个状态记录被砍的树木的价值之和,篱笆长度之和,还有砍倒的树的数量,最后砍完剩
2013-10-09 20:14:48
1301
原创 Scrambled Polygon(poj2007极角排序输出凸包)
题意:给你一些点,让你按照极角的顺序输出凸包的顶点思路:直接按照向量排序按照向量叉乘的正负判断点所在的位置,类似于卷包裹的凸包,每次按照一条边排序,选择最外面的一条边,再按照选择的边在排序,再选直到点重合位置这道题直接按照(0,0)点极角排序,如果极角相同选择最近的那个因为在一条直线上先选近的再选远的,如果选择远的那点的顺序都不对了#include#include#incl
2013-10-08 19:21:27
549
原创 Wall(poj1113凸包+圆的弧长)
题意:给一些点,用一个多边形把这些点包起来,并且所有点到边的距离至少为L思路:先求一个凸包然后再加上一个圆的弧长,为什么加圆的弧长呢?可以证明每个顶点到他距离为L的点组成了一个圆弧,过该点做两条垂线可以证明所有点的这些圆弧这些角度加起来正好360度是一个圆,所有就加上一个半径为L的圆#include#include#include#include#include#includ
2013-10-08 17:16:35
533
原创 A Round Peg in a Ground Hole(POJ1584点在多边形内+是否为凸多边形)
题意:顺时针或逆时针给你一些点判断是否为凸多边形,如果不是输出HOLE IS ILL-FORMED如果是在判断圆是否在多边形内思路:圆在多边形内,判断原点到每个点的距离如果有一条边小于半径那就不在多边形内#include#include#include#include#includeusing namespace std;struct Point{ doubl
2013-10-07 20:41:13
766
原创 Geometric Shapes (poj3449多边形相交)
题意:给你一些多边形的点,判断每个多边形和那些多边形相交,编号按照字典序输出思路:枚举每个多边形的每条边看是否相交,这里的相交是包括端点的,关键是给你正方形不相邻两个点求另外两个点怎么求,长方形给你3个点求第四个点怎么求?因为对角线的交点为两条对角线的中点,所以 x0 + x2 = x1 + x3y0 + y2 = y1 + y3可以证明分割的这几个小三角形是全等的
2013-10-07 19:14:10
1049
原创 Pipe(poj1039线段相交)
题意:给你一个管道,看是光线是否从管道射出,管线没有反射,不能接触管道的边,但是能接触拐点思路:光线穿过管道一定是经过两个拐点,一个上拐点,一个下拐点,所以枚举所有拐点,如果该直线可以穿过管道那么上方的点一定在直线的左边,下放的点一定在直线的右边,所以枚举每两个点,判断有没有上方的点在直线的右边,下方的点有没有在直线的左面,有则说明直线和管道有交点,求出交点,最后取最大值,如果线段在该线段之前
2013-10-07 14:13:40
647
原创 Kadj Squares(poj3347线段的区间覆盖)
题意:给你几个正方形的边长,正方一个顶点在x轴上然后边与x轴的夹角为45度,每个正方形都是紧贴的,问从上面看能看的正方形的编号思路:正方形有左右两个顶点,怎么判断被覆盖呢?便利每一条线段,如果和其他线段有交集那个去掉交集部分,继续遍历,最后看是否还剩下线段,剩下说明没有被覆盖,反之被覆盖了怎么确定每个正方形的区间呢,根据边长,将边长扩大根号2倍就避免了小数,如果两个边长相等的正方形放在
2013-09-28 09:33:58
984
原创 An Easy Problem?!(poj2826线段相交,直线线段相交)
题意:给你两个同样长的木板,围城一个多边形,水从空中垂直下落,问木板能盛放多少体积的水。思路:分类讨论1.如果线段没有交点,那么面积就是02.如果线段有交点,但是有一个模板被另一个木板覆盖还是接不到水,怎么判断了,过两个木板的最高的两个点做垂线,如果垂线和和交点到另一木板的顶点这段相交,说明木板有覆盖,不行可以画个图试试,但是覆盖不一定遮挡,所以要判断交点是在另一个木板顶点的上下,在上
2013-09-28 08:32:14
1342
原创 Space Ant(poj1410叉积的极角排序)
题意:有一种蚂蚁,他只能向左转,他还要吃植物,给你一个图,图上有好多植物的坐标,为找到一条路径使得这只蚂蚁吃得最多的植物思路:极角排序,选定一个最外围的一个点,怎么排序呢?三个点的叉乘可以确定哪条直线在右面,一个点在另一点的右面,说明这个点更靠外面,就是根据这个叉乘排序选择第一个,然后再根据选择的点在排序,在选择第一个,这样一直选择下去c++忘完了快,写了个三个参数的构造函数,当传2个
2013-09-26 09:42:44
702
原创 Intersection(poj1401线段和矩形相交)
题意:给你一条线段和一个矩形,判断线段是否和矩形相交,线段在矩形当中也算相交,并且矩形的坐标不是左上右下思路:这道题知道自己模板错了,1.线段相交判看是否有线段的端点在线段上,就是说要特判点在线段上2.点在直线上要包括点在线段的两个端点,即dcmp(Cross(b-a,p-a)) == 0 && dcmp(Dot(b-p,a-p)) 剩下的就是细心加细心#include#
2013-09-25 16:37:01
828
原创 Treasure Hunt(poj1066线段相交)
题意:在一个正方形中有多条线段,线段的端点都在正方形的边上,有一个点,然后求从边上到该点最少需要穿过几条线段。思路:和在一群线段里找一条直线,它穿过所有的线段,而这条直线一定过两条线段的端点,所以可以试想该线段一定是正方形四周的一个点,所以遍历四周的线段的点,找到最小的相交次数。注意:当n == 0 的时候我刚开始直接输出结果了,其实还要再读一个点!!!!wa哭了#incl
2013-09-25 13:56:56
732
原创 The Doors(poj1556线段相交+最短路径)
题意:给你一个正方形的盒子,里面有一些线段,求从(0,5)出发到(10,5)的最短路径,线段是按照x排序的思路:先判断(0,5)和(10,5)组成的线段是否和其他线段相交,如果不相交,最短距离就是这两点的距离,如果相交就用最短路径最短路径的使用:Dijkstra算法是求一个点到其他所有点的最短路径首先要知道刚开始的图,才能进行最短路,怎么建图呢?根据题意我们知道最短路径一定经过
2013-09-24 17:57:47
1015
原创 Intersecting Lines(poj1269)
题意: 给你两条直线,判断他们的位置,1.平行,2.重合,3.相交思路:平行:点在同一边,并且点到直线的距离相等,重合:两点到直线的距离为都0,其余就是相交g++ 判double 要用%f 不能用%lf c++判double 都可以还有就是模板不能写错啊.......#include#include#include#include#includeusing nam
2013-09-24 08:57:38
574
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人