收藏 分享(赏)

福州大学acm2011冬季讲座数学在acm中.ppt

上传人:天天快乐 文档编号:590370 上传时间:2018-04-13 格式:PPT 页数:73 大小:1.61MB
下载 相关 举报
福州大学acm2011冬季讲座数学在acm中.ppt_第1页
第1页 / 共73页
福州大学acm2011冬季讲座数学在acm中.ppt_第2页
第2页 / 共73页
福州大学acm2011冬季讲座数学在acm中.ppt_第3页
第3页 / 共73页
福州大学acm2011冬季讲座数学在acm中.ppt_第4页
第4页 / 共73页
福州大学acm2011冬季讲座数学在acm中.ppt_第5页
第5页 / 共73页
点击查看更多>>
资源描述

1、福州大学ACM2011冬季讲座数学在ACM中的运用,黄泗勇overpower_,数学包括哪些,数论组合数学计算几何微积分概率论数值分析。有兴趣的同学可以去图书馆借或者自己购买相关书籍,介绍几本书,基本代数,1.gcd (最大公约数) (a,b) (10,5) = 5如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数。几个自然数公有的约数,叫做这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数。2.lcm(最小公倍数)最小公倍数(Least Common Multiple,缩写L.C.M.),对于两个正整数数来说,指该两数共有倍数中最小的一个。计算最小公

2、倍数时,通常会借助最大公约数来辅助计算。,3.取模( mod)用法及意义是:ab(mod c) 的意思是a和b除以c后余数相同读作a与b同余,mod为c 例如:a mod b=c说明:a除以b余数为cMOD (Pascal)%(C/C+/Java)注意在计算机上使用取模以后可能得到负值.,数论在ACM中的应用,简介,数论一般以素数判断和同余为模型构造出来的题目往往需要较多的数论知识来解决,这部分在ACM竞赛中的比重并不大,但只要来上一道,也足以使知识不足的人冥思苦想上一阵时间。素数判断和同余最常见的是在以密码学为背景的题目中出现,在运用密码学常识确定大概的过程之后,核心算法往往要涉及数论的内容

3、。,数论在ACM比赛中,常见主要有三个出题点:一、素数问题;二、最大公约数,最小公倍数问题;三、同余问题。,一、素数问题:,1.可以暴力枚举1.n的数字,如果存在某个数I,有n%i=0,那么这个数肯定不是素数,复杂度显然是O(n)2.稍微优化一下,可以知道实际上n的因子是成对出现的(除非N是完全平方数).所以只需要枚举1.sqrt(N)判断既可,复杂度O(sqrt(N)如果用这样能过赛场的题,那日子就好混了,(例)FOJ1075分解素因子,题意:假设x是一个正整数,它的值不超过65535(即1x= 65535),请编写一个程序,将x分解为若干个素数的乘积。 分析:x好小,枚举1到x吧,能整除就

4、是他的素因子,并把这个因子除掉。for(i=2;ix;i+)while(x%i = 0)输出;x/=i;,米勒-拉宾素数测试,如果N很大,那如何判断?基于费马小定理有一种方案可以解决,既随机化算法.我们知道对于某个素数P,由费马小定理得: a(p-1) (mod p) (a,p互质)于是就有了希望使用这个来判断某个p是否是素数,(例)FOJ1649,题意是,判断一个整数N是不是素数,(2=N=1018).这是费马小定理的应用,用随机化算法判定一个数是不是素数FOJ1650,2.厄拉多塞筛法:,可用于批量判断素数,而且效率很可观。原理就是把2的倍数去掉,3的倍数去掉,5的倍数去掉,依次类推(详见

5、下一页)。for(i=2;i*isqrt(n);i+)if(ai=0)for(j=i*i;jsqrt(n);j+=i)aj=1;,贴的,因子个数,根据组合数学可以很容易的知道Ans=(1+c1)*(1+c2)*.*(1+cl)为什么?因为每个素因子选的个数0.c1,有(1+c1)种组合,根据组合数学的乘法原则,直接乘完就是解.,因子和,ans=(1+p1+p12+p1c1)*(1+p2+p22+p2c2)*(1+pl+pl2+plcl)Pi表示N的第i种素因子Ci表示N的第i种素因子的个数如果N比较大,那么结果很可能比较大,注意合适选择64 位,FOJ1563:已知2=a=b=1000000,

6、问a,b间有几个素数。筛法筛一下,线性扫描一次。FOJ1648:1=LU=2147483647(好大),找出一对距离最大的相邻素数D1,D2满足(L=D1D2=U),其中U-L=1000000(不大)。对L到U这段区间进行筛法。,二、最大公约数最小公倍数,这日子不好混啊,枚举显然不行欧几里德求最大公约数(证明略):BIGNUM gcd(BIGNUM m,BIGNUM n) while (true) if (m = m % n) = 0) return n;if (n = n % m) = 0) return m;a和b的最小公倍数为:a*b/gcd(a,b);,(例) FOJ1396,根据容斥

7、原理化简,得求所有数的最大公约数。,【扩展欧几里德算法】gcd(a, b) = a*x+b*y输出x,y,函数返回GCD(a, b)最大公约数BIGNUM ext_gcd(BIGNUM a, BIGNUM b, BIGNUM ,三、同余问题,数学上,两个整数除以同一个整数,若得相同余数,则二整数同余。两个整数a,b,若它们除以整数m所得的余数相等,则称a,b对于模m同余,记作ab(mod m)。这边主要作三个介绍:、同余的性质;、欧拉定理;、中国剩余定理。,1、同余的性质,(A+B) mod c = (A mod c) + (B mod c) mod cA*B mod c = (A mod c

8、) * (B mod c) mod cAb mod c = (Ab-1 mod c)* A) mod c(A/B) mod c = (A mod (B*c) /B,(例)FOJ1586,题意:给你一个整数n(0 = n = 10000),n不能被2或者5整除,问是存在一个只由1组成的整数能整除n。不存在输出-1,存在输出该整数的位数,若有多种情况输出最小的。,(续),为避免高精度计算,我们可以利用公式:(A*B) mod c=(A mod c)*(B mod c) mod c(A+B) mod c=(A mod c)+(B mod c) mod c例如1111%6(111*10 + 1)% 6

9、FOJ1017 Playing with Calculator,2.欧拉定理,与互质且小于的数的个数在程序中利用欧拉函数如下性质,可以快速求出欧拉函数的值(a为N的质因数):若(N%a=0 FOJ1012和FOJ1464:就是求欧拉函数。,3.中国剩余定理,民间传说着一则故事“韩信点兵”。秦朝末年,楚汉相争。一次,韩信将1500名将士与楚王大将李锋交战。苦战一场,楚军不敌,败退回营,汉军也死伤四五百人,于是韩信整顿兵马也返回大本营。当行至一山坡,忽有后军来报,说有楚军骑兵追来。只见远方尘土飞扬,杀声震天。汉军本来已十分疲惫,这时队伍大哗。韩信兵马到坡顶,见来敌不足五百骑,便急速点兵迎敌。他命令

10、士兵3人一排,结果多出2名;接着命令士兵5人一排,结果多出3名;他又命令士兵7人一排,结果又多出2名。韩信马上向将士们宣布:我军有1073名勇士,敌人不足五百,我们居高临下,以众击寡,一定能打败敌人。汉军本来就信服自己的统帅,这一来更相信韩信是“神仙下凡”、“神机妙算”。于是士气大振。一时间旌旗摇动,鼓声喧天,汉军步步进逼,楚军乱作一团。交战不久,楚军大败而逃。,计算几何在ACM中的应用,引言,计算机的出现使得很多原本十分繁琐的工作得以大幅度简化,但是也有一些在人们直观看来很容易的问题却需要拿出一套并不简单的通用解决方案,比如几何问题。作为计算机科学的一个分支,计算几何主要研究解决几何问题的算

11、法。在现代工程和数学领域,计算几何在图形学、机器人技术、超大规模集成电路设计和统计等诸多领域有着十分重要的应用。,计算几何特点,在ICPC竞赛中,计算几何相比于其它部分来说是比较独立的。除近年来出现与图论和动态规划相结合的题目,计算几何与其它的知识点很少有过多的结合。计算几何的题目难度不会很大,但也永远不会成为最弱的题。计算几何题目具有代码量大、特殊情况多、精度问题难以控制等特点。对几何公式、三角函数等要求精通。不好找数据调试。,准备知识,头文件#include 浮点数double float常量const double PI = acos(-1.00);#define PI 3.141592

12、6535897932384626433832795const double INF = 1e100;const double EPS = 1e-6;,准备知识(续),符号函数Double a, b;A = bint sign(double d) if(fabs(d) 0) ? 1 : -1;,浮点误差,请不要直接用等号判断浮点数是否相等!解决方法一,误差判断法: const double EPS=1e-9; 浮点数判断相等,fabs(x-y)EPS; 浮点数判断为零,fabs(x)EPS。解决方法二,化浮为整法: 在不溢出整数范围的情况下,可以通过乘上10的k次方,转化为整数运算,最后在将结果

13、转化为整数。,基本概念的表示形式,点 Point,typedef struct TPoint double x; double y; /double z;TPoint;,线段 Segment,typedef struct TSegment TPoint a,b; Tsegment;,直线 Line,typedef struct TLine /直线方程的系数 double a, b, c;TLine; ax + by + c = 0,三角形 Triangle,struct TTriangle TPoint p3; ;,圆 Circle,typedef struct TCircle double

14、r; TPoint centre;TCircle;,多边形 Polygon,typedef struct TPolygon TPoint pMaxNode; int n;TPolygon;,向量,基本定义,向量既有大小又有方向的量叫做向量。用坐标表示和用有向线段表示。,叉积和点积,向量叉积计算向量叉积是与直线和线段相关算法的核心部分。,叉乘有啥用?,点乘,PQ=x1*x2+y1*y2。主要用来判断两向量的夹角大小,向量的旋转,坐标或向量向量(x, y)关于原点的逆时针旋转后的坐标为(x, y),向量的运算的应用,求两个向量的夹角(acos, asin)判断向量的位置和方向求三角形面积判断三点共

15、线,判断点与线段关系,设点为Q,线段为P1P2 ,判断点Q在该线段上的依据是:( Q -P1 ) ( P2 -P1 ) = 0 且Q 在以P1,P2为对角顶点的矩形内。前者保证Q点在直线P1P2上,后者是保证Q点不在线段P1P2的延长线或反向延长线上。,判断线段和直线是否相交,取直线上一点,连接线段的两点,如果所得的两系线段都在直线的同一侧,则不相交。,判断线段是否相交,两条线段恰有惟一一个不是端点的公共点,称之为“规范相交”。 否则称为非规范相交。两条线段规范相交时,每条线段两个端点都在另一条线段的异侧。,判断两线段是否相交(续),我们分两步确定两条线段是否相交:(1)快速排斥试验设以线段

16、P1P2 为对角线的矩形为R,设以线段 Q1Q2 为对角线的矩形为T,如果R和T不相交,显然两线段不会相交。,判断两线段是否相交(续),(2)跨立试验如果两线段相交,则两线段必然相互跨立对方。 若P1P2跨立Q1Q2 ,则矢量 ( P1 - Q1 ) 和( P2 - Q1 )位于矢量( Q2 - Q1 ) 的两侧。同理判断Q1Q2跨立P1P2。,(例)FOJ1015 土地划分,给你n条线段,问土地被划分为几块转化为判断线段是否规范相交,向量的运算的应用,计算点到线段、直线的最近点求点到直线的距离求点关于直线的对称点 构造两点中垂线 ,多边形,三角形面积,S = a * h / 2 = a *

17、b * sin(c)/2 = a * b * c / (4R) = a * b * c * r / 2 = sqrt(p * (p a) * (p b) * (p c) 海伦公式R为外接圆半径r为内切圆半径p =(a+b+c)/2,三角形五心,外心:三边中垂线交点,到三角形三个顶点的距离相等内心:角平分线的交点,到三角形三边的距离相等垂心:三条高线的交点重心:三条中线的交点,到三角形三顶点距离的平方和最小的点,三角形内到三边距离之积最大的点.旁心:三角形的一条内角平分线与其他两个角的外角平分线的交点,旁心到三角形一边及其他两边延长线的距离相等,多边形,由在同一平面且不在同一直线上的多条线段首尾

18、顺次连结且不相交所组成的图形叫做多边形。,P60,凸多边形,凸多边形:过多边形任意一边做一条直线,如果其他各顶点都在这条直线的同侧,则把这个多边形叫做凸多边形。凸多边形的判定复杂度O(N),P61,简单多边形的面积,“有向面积”A比“面积”S其实更本质!,简单多边形的面积,double area_poly(TPoint p, int n) double res = 0; pn = p0; for(int i = 0;i n;+ i) res += cross(pi, pi+1); return fabs(res)/2.00;,P63,多边形的重心,一个物体的各部分都要受到重力的作用。从效果上看

19、,我们可以认为各部分受到的重力作用集中于一点,这一点叫做物体的重心。质量均匀分布的物体,重心的位置只跟物体的形状有关,它的重心就在几何重心上。,FOJ 1331 Stone,求多边形的重心,P65,点与多边形的位置关系,射线法从这个点开始做一条射线,通过与多边形交点的个数来判断。特殊情况,P66,点与多边形的位置关系,环顾法通过沿多边形走一圈,累计饶了点P多少角度来判断P的内外。,(例)FOJ1120 A Pilot in Danger!,判断一点是否在多边形里面,P68,凸包,对于一个平面点集,它的凸包指的是包含它的最小凸图形或最小凸区域。,P69,凸包的求法,卷包裹法,P70,凸包的求法,Graham-Scan算法,push(p1);push(p2);i = 3;while i = n do if p1在栈顶边的左手方向then push(pi); 并且i+else pop();,P71,凸包的求法,melkman算法,(例)1333 Surround the Trees,求点集的凸包周长,作业,FOJ1075 1649 1650 1563 1648 13961586 1017 1464 10121015 1331 1333 1621ACM_DIY 48866438AekdyCoin: 64195697,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经济财会 > 贸易

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报