




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
數(shù)論和計算幾何2/2/2023數(shù)論方面2/2/2023整除兩個整數(shù)a和b(a<>0),如果存在一個整數(shù)c,滿足a*c=b,則稱為a整除b,符號記為a|b。2/2/2023mod運(yùn)算給定一個正整數(shù)p,任意一個整數(shù)n,一定存在等式n=kp+r其中k、r是整數(shù),且0≤r<p,稱呼k為n除以p的商,r為n除以p的余數(shù)。我們定義r為nmodp。2/2/2023mod運(yùn)算的性質(zhì)(a+b)modc=((amodc)+(bmodc))modc(a-b)modc=((amodc)-(bmodc))modc(a*b)modc=((amodc)*(bmodc))modc注意:(a/b)modc的求法需要運(yùn)用乘法逆元,有關(guān)資料可以上網(wǎng)查找,這里就不闡述了。2/2/2023素數(shù)與合數(shù)如果一個大于1的整數(shù),其因數(shù)只有1和其本身,那么則稱這個整數(shù)為素數(shù),否則為合數(shù)。1既不是素數(shù)也不是合數(shù)2/2/2023素數(shù)判斷若整數(shù)c是一個合數(shù),則他必然有一個<=sqrt(n)的因子,因?yàn)槿鬭是c的因子,必然存在因子b,使得a*b=c,而a和b若同時大于sqrt(c),則a*b>c,不符合條件,所以上述結(jié)論成立。因此我們判斷一個數(shù)字n是否是素數(shù),只需枚舉2到sqrt(n)中是否存在n的因子,不存在則為素數(shù),存在的話則是合數(shù)。時間復(fù)雜度O(sqrt(n)).2/2/2023若一個數(shù)字p是合數(shù),用上述作法也可以求出這個數(shù)字的約數(shù)個數(shù)和其約數(shù)具體是哪些數(shù)字。若數(shù)字a是數(shù)字p的約數(shù)(a<=sqrt(p)),則p/a也是其約數(shù)。2/2/2023篩法篩法是用來求不超過整數(shù)n(n>1)的所有質(zhì)數(shù)的一種方法。最常用的篩法是埃拉托斯特尼篩法,具體做法是:先把N個自然數(shù)按次序排列起來。1不是質(zhì)數(shù),也不是合數(shù),要劃去。第二個數(shù)2是質(zhì)數(shù)留下來,而把2后面所有能被2整除的數(shù)都劃去。2后面第一個沒劃去的數(shù)是3,把3留下,再把3后面所有能被3整除的數(shù)都劃去。3后面第一個沒劃去的數(shù)是5,把5留下,再把5后面所有能被5整除的數(shù)都劃去。這樣一直做下去,就會把不超過N的全部合數(shù)都篩掉,留下的就是不超過N的全部質(zhì)數(shù)。當(dāng)然還有其他的篩法,這里就不一一敘述了。2/2/2023算術(shù)基本定理任何一個大于1的自然數(shù)N,都可以唯一分解成有限個質(zhì)數(shù)的乘積N=(P1^a1)*(P2^a2)......(Pn^an),這里P1<P2<...<Pn是質(zhì)數(shù),其諸方冪ai是正整數(shù)。2/2/2023質(zhì)因數(shù)分解我們可以從2到sqrt(n)枚舉整數(shù)n的質(zhì)因數(shù),如果數(shù)字i滿足i|n,則i就是p的一個質(zhì)因子,這是我們將n/i。當(dāng)然n有可能包含多個i,所以還需要記錄出現(xiàn)了多少個i,然后依次枚舉下去。當(dāng)然這里不會出現(xiàn)枚舉的數(shù)字不是質(zhì)因子的情況,因?yàn)槿绻?dāng)前枚舉的數(shù)字是合數(shù)p,則這個合數(shù)的質(zhì)因數(shù)在之前就已經(jīng)從n中剔除掉了,此時的n是無法被p整除的。2/2/2023若最后的n不為1,則此時的n也為原來的n的質(zhì)因子。因?yàn)橐粋€整數(shù)N可以分解為有限個質(zhì)數(shù)的乘積N=(P1^a1)*(P2^a2)......(Pn^an)因此其約數(shù)個數(shù)除了之前提到的方法進(jìn)行統(tǒng)計,還可以使用其分解質(zhì)數(shù)的個數(shù),來進(jìn)行統(tǒng)計F(N)=(1+a1)*(1+a2)*.....(1+an)2/2/2023例題N因子給你一個整數(shù)N(N<=20000),要求你求出至少包含N個因子的最小整數(shù)是多少?2/2/2023首先對于一個數(shù)求其約數(shù)個數(shù)之前我們有提到過兩種方法,這題我們?nèi)羰且粋€個數(shù)枚舉過去,找到一個最小的數(shù)字其約數(shù)個數(shù)>=N,那么用這兩種中哪一種方法求約數(shù)個數(shù),很明顯都是要不可行的。2/2/2023但是利用第二種求約數(shù)總數(shù)的方法,我們可以設(shè)定一個約數(shù)總數(shù)M,求出一個包含M個約數(shù)的整數(shù)(但是不一定是最小的包含M個約數(shù)的整數(shù))。假設(shè)我們要求構(gòu)造一個有x個約數(shù)的數(shù)字y,那么我們可以將x進(jìn)行分解x=a1*a2*...an因?yàn)閥是由我們構(gòu)造的,因此y的質(zhì)因子可以隨便選取,為了使的y盡量小,我們可以從小到大選擇質(zhì)因子,同時使得a1>a2>a3...>an,新構(gòu)造的數(shù)字為y=2^(a1-1)*3^(a2-1)*5^(a3-1)*....*P^(an-1)2/2/2023具體實(shí)現(xiàn)我們可以用搜索,設(shè)一個搜索上界M,用前面所述的方法去枚舉每個質(zhì)因數(shù)的指數(shù)構(gòu)造不超過m的整數(shù)。如果有構(gòu)造數(shù)因子數(shù)超過了n并且比當(dāng)前答案要優(yōu),那么更新答案。2/2/2023而上界我們也可以大致的進(jìn)行一個估計,估計的數(shù)字為第1個素數(shù)到第log(20000)+1個素數(shù)的乘積,由前面分析的情況可以得知這是一個包含2^(log(20000)+1)個因子的數(shù)字,超過了數(shù)據(jù)的最大范圍。因此題目所要求的最小數(shù)字一定在這個數(shù)字的范圍之內(nèi)。2/2/2023例題給定正整數(shù)a與b,求a到b之間素數(shù)的個數(shù)。1<=a<=b<=1000000000b-a<=10000002/2/2023如果直接把a(bǔ)到b之間的數(shù)字一個個判斷它們是否是素數(shù)顯然是行不通的。如果直接用篩法篩出b以內(nèi)所有的素數(shù),很顯然還是行不通的。那么對于這么大的數(shù)據(jù),怎么做才能行得通呢?2/2/2023之前證明過一個整數(shù)n是合數(shù)的話在2到sqrt(n)以內(nèi)必然會有一個因子,而這個因子有可能是合數(shù)或者質(zhì)數(shù),如果是合數(shù)的話那么很顯然這個合數(shù)因子可以拆分成更小的質(zhì)數(shù)因子,因此可以得出結(jié)論:整數(shù)n是合數(shù)的話在2到sqrt(n)以內(nèi)必然會有一個質(zhì)因子。有了這樣的結(jié)論,那么這題的思路就很明朗了。2/2/2023首先我們篩出1到sqrt(b)之內(nèi)所有的質(zhì)數(shù),再用這些質(zhì)數(shù)去篩出a到b之內(nèi)的質(zhì)數(shù),如果a到b之間的數(shù)字i沒有一個小于sqrt(b)的質(zhì)因子,那么他就是質(zhì)數(shù),否則就是合數(shù)。這樣一來就可以算出答案了。2/2/2023GCD最大公約數(shù)(GCD):設(shè)a和b為兩個不全為0的整數(shù),能使c|a并且c|b的最大整數(shù)c,稱c為a與b的最大公約數(shù)2/2/2023求gcd的常用解法:輾轉(zhuǎn)相除法gcd(a,b)=gcd(b,amodb)證明:a可以表示成a=kb+r則r=amodb。假設(shè)d是a,b的一個公約數(shù),則d|a,d|b,而r=a-kb,因此d|r。因此d也是(b,amodb)的公約數(shù)。因此(a,b)和(b,amodb)的公約數(shù)是一樣的,其最大公約數(shù)也必然相等,得證。時間復(fù)雜度O(logn)2/2/2023多個數(shù)的gcdgcd(a,b,c)=gcd(a,gcd(b,c))2/2/2023LCM最小公倍數(shù)(LCM):設(shè)a和b為兩個不全為0的整數(shù),能使a|c并且b|c的最小整數(shù)c,稱c為a與b的最小公倍數(shù)a*b=gcd(a,b)*lcm(a,b)2/2/2023LCM的解法lcm(a,b)=a*b/gcd(a,b)多個數(shù)的LCMlcm(a,b,c)=a*b*c/gcd(a,b,c)2/2/2023例題1[noip2009]Hankson的趣味題n組數(shù)據(jù)每組數(shù)據(jù)給定正整數(shù)a0,a1,b0,b1,設(shè)某未知正整數(shù)為X,X滿足:1.X和a0的最大公約數(shù)是a1。2.X和b0的最小公倍數(shù)是b1。求滿足上述條件的正整數(shù)X的個數(shù)[數(shù)據(jù)范圍]n<=20001<=a0,a1,b0,b1<=20000000002/2/2023如果數(shù)據(jù)范圍很小,我們可以直接枚舉X,把X帶入條件1和條件2進(jìn)行檢驗(yàn),可行的話就累加答案。這樣的枚舉可以進(jìn)行優(yōu)化,我們把枚舉檢驗(yàn)的對象變?yōu)閍1的倍數(shù),因?yàn)閍1是x和a0的最大公約數(shù),所以a1的倍數(shù)自然有可能是x,但是由于數(shù)據(jù)范圍很大,這樣的方法不能使我們拿到全部的分?jǐn)?shù)2/2/2023我們從更細(xì)的地方進(jìn)行思考,我們可以對最小公倍數(shù)和最大公約數(shù)進(jìn)行分解質(zhì)因數(shù)后的指數(shù)進(jìn)行分析。將A和B兩個整數(shù)進(jìn)行分解質(zhì)因數(shù)A=p1^a1+p2^a2+p3^a3+......B=p1^b1+p2^b2+p3^a3+......這樣最小公倍數(shù)和最大公約數(shù)可表示為gcd(a,b)=p1^min(a1,b1)+p2^min(a2,b2)+p3^min(a3,b3)+.....lcm(a,b)=p1^max(a1,b1)+p2^max(a2,b2)+p3^max(a3,b3)+.....2/2/2023這樣我們可以先用篩法預(yù)處理出trunc(sqrt(2000000000))以內(nèi)全部的素數(shù),用這些素數(shù)我們可以算出a0,a1,b0,b1每種質(zhì)數(shù)因子的個數(shù)t1,t2,t3,t4設(shè)我們要求的x的每種質(zhì)因數(shù)個數(shù)為S若數(shù)據(jù)合法,則t1>=t2,t3<=t4在數(shù)據(jù)合法的情況下,結(jié)合之前我們得出的最大公約數(shù)和最小公倍數(shù)質(zhì)因數(shù)分解后指數(shù)的關(guān)系,我們可以求出S的范圍1.若t1>t2,則s=t2,若t1=t2,則s>=t22.若t3<t4,則s=t4,若t3=t4,則s<=t4將1和2得到的s集合進(jìn)行并集,如果為空集,則表示無解,直接輸出0,否則用乘法原理,將得出的s的個數(shù)乘進(jìn)答案中。2/2/2023例題2設(shè)有兩個正整數(shù)集A和B,如果正整數(shù)n既是A中所有元素的公倍數(shù),又是B中所有元素的公約數(shù),則n為因子約數(shù)。請找出有多少個n。正整數(shù)集A有x個數(shù),正整數(shù)集有y個數(shù)(1<=x,y<=50,1<=ai,bi<=1000000000)
2/2/2023和第一題其實(shí)差不多,我們分別求出正整數(shù)集A的最小公倍數(shù)X和正整數(shù)集B的最大公約數(shù)Y,因?yàn)榭尚械囊蜃蛹s數(shù)質(zhì)因數(shù)分解后的每個質(zhì)因數(shù)個數(shù)的范圍和X、Y有關(guān),所以把X和Y進(jìn)行質(zhì)因數(shù)分解,可以和上題一樣,對于某個質(zhì)因數(shù)pi,若x中所包含的pi個數(shù)與y中所包含的pi個數(shù)的交集為空集,則判定為無解,否則統(tǒng)計進(jìn)答案中。2/2/2023互質(zhì)當(dāng)N個整數(shù)的最大公約數(shù)為1時,稱這N個數(shù)互質(zhì)。2/2/2023☆歐拉函數(shù)對正整數(shù)n,歐拉函數(shù)φ(n)是小于或等于n的正整數(shù)中與n互質(zhì)的數(shù)的數(shù)目。φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中p1,p2……pn為x的所有質(zhì)因數(shù),x是不為0的整數(shù)。2/2/2023快速冪快速冪是用來快速計算a^nmodp的一種方法。如果n是偶數(shù)則a^n=a^(n/2)*a^(n/2)如果n是奇數(shù)則a^n=a^(n/2)*a^(n/2)*a如果在最后才進(jìn)行modp可能會溢出,根據(jù)之前說的mod運(yùn)算的性質(zhì),我們在遞歸時可以邊做邊取模。2/2/2023同余兩個整數(shù)a,b,若它們除以正整數(shù)m所得的余數(shù)相等,則稱a,b對于模m同余記作a≡b(modm)2/2/2023擴(kuò)展歐幾里得擴(kuò)展歐幾里得算法可以求出方程ax+by=gcd(a,b)的一組解。在歐幾里得算法中,當(dāng)b=0時,此時a則為原a、b的最大公約數(shù),此時滿足上面方程的解為x=1,y=0。通過遞歸,若已知bx'+(amodb)y'=gcd(a,b)的解x'和y'則gcd(a,b)=bx'+(amodb)y'=bx'+(a-[a/b]*b)y'=ay'+b*(x'-[a/b]*y')所以x=y',y=x'-[a/b]*y'由此可知ax+by=gcd(a,b)的解,不斷的向上回溯,最后得到結(jié)果
2/2/2023例題
【noip2012D2】同余方程求關(guān)于x的同余方程ax≡1(modb)的最小正整數(shù)解。數(shù)據(jù)保證一點(diǎn)有解。(2<=a,b<=2000000000)2/2/2023這里可以把方程轉(zhuǎn)換成axmodb=1,進(jìn)而再轉(zhuǎn)化成ax+by=1。ax+by=1有解的充要條件為d=gcd(a,b)=1證明:(1)若ax+by=1有解則方程左邊必能被d整除,而右邊也需要能被d整除,因此d=1。(2)存在一系列正整數(shù)或負(fù)整數(shù)x使得ax+by=d=1結(jié)合上述兩點(diǎn)得證。2/2/2023這里求得的只是ax+by=1的一組解,而題目要求x需要是最小正整數(shù)。假設(shè)求出來的解是x0和y0,那么其余的解為x=x0+b*ty=y0-a*t由上式就可以求出ax≡1(modb)的最小正整數(shù)解。2/2/2023擴(kuò)展歐幾里得最常見的用途就是解不定方程ax+by=c,當(dāng)然還有其他用途,但是在這里我就不深入闡述了,如果有感興趣的同學(xué)可以自己上網(wǎng)搜索相關(guān)資料。2/2/2023
計算幾何方面2/2/2023浮點(diǎn)誤差的處理因?yàn)橛嬎銠C(jī)處理浮點(diǎn)數(shù)會有精度問題,比如正確的結(jié)果應(yīng)該為0,可是計算機(jī)計算出來的結(jié)果卻0.000000001,因此我們實(shí)現(xiàn)程序的時候應(yīng)該記得對誤差進(jìn)行處理。2/2/2023具體程序funtionsgn(x:extended):integerbeginifabs(x)<=epsthensgn:=0elseifx>epsthensgn:=1elsesgn:=-1;end;2/2/2023向量與叉積向量:以(0,0)為起點(diǎn)到以(x,y)為終點(diǎn)的有向線段。叉積:向量A(x1,y1)和向量B(x2,y2)的叉積=x1y2-x2y1,即|A||B|sin(a,b)2/2/2023叉積有一個很重要的性質(zhì),它可以通過符號來判斷兩向量間的順逆時針關(guān)系(定義順逆時針度數(shù)為180度內(nèi))若P*Q>0,則P在Q順時針方向。若P*Q<0,則P在Q逆時針方向。若P*Q=0,則P與Q共線,但可能同向也有可能反向。2/2/2023叉積還有一個性質(zhì),叉積會等于向量A、B作為鄰邊圍成的平行四邊形OACB的有向面積,要注意的是有向面積有正有負(fù),我們將其取模后,即可得到平行四邊形OACB的面積。2/2/2023多邊形面積叉積可用于多邊形面積的作法,具體作法是把原點(diǎn)與多邊形的每個頂點(diǎn)連一條邊,然后依次求出多邊形相鄰兩個頂點(diǎn)與原點(diǎn)構(gòu)成的向量的叉積,取其總和后在取摸除以2就是該多邊形面積。2/2/2023例題POJ2318[TOY]一個矩形箱子,左上角與右下角的坐標(biāo)給出,里面有n塊板把箱子里的空間分隔成n+1個分區(qū),給出這些板在上邊的x坐標(biāo)、下邊的x坐標(biāo),以及m個玩具的坐標(biāo),求這些分區(qū)里的玩具數(shù)目。n,m<=5000。2/2/2023首先我們可以把隔板從左到右進(jìn)行排序。一個分區(qū)是由兩個隔板形成的,而判斷一個玩具是否在一個分區(qū)里面,我們可以一一枚舉兩個相鄰的隔板,運(yùn)用之前說的叉積的性質(zhì),來判斷點(diǎn)是否在分區(qū)內(nèi)。如果點(diǎn)在兩線段同側(cè),則不在該分區(qū)內(nèi),否則賊在分區(qū)內(nèi)。該算法時間復(fù)雜度O(n^2),足以通過所有數(shù)據(jù)點(diǎn),如果用二分來實(shí)現(xiàn)算法,可以優(yōu)化到O(nlogn)。2/2/2023線段位置關(guān)系我們可以通過判斷線段是否跨立和比較坐標(biāo)來判斷線段是否相交、重合或者分離。首先判斷是否互相跨立就是用叉積的性質(zhì)來判斷a和b是否在cd異側(cè),c和d是否在ab異側(cè)。當(dāng)然通過上述的作法還不夠,因?yàn)槿绻鲜鲎鞣ǖ贸龅牟娣e都是0,那么說明兩線段共線,而共線的情況有分離相交和重合,這是我們可以比較坐標(biāo)的關(guān)系來求出線段的位置關(guān)系。2/2/2023凸包點(diǎn)集Q的凸包是指一個最小凸多邊形,滿足Q中的點(diǎn)或者在多邊形邊上或者在其內(nèi)。一組平面上的點(diǎn),求一個包含所有點(diǎn)的最小的凸多邊形,這就是凸包問題。2/2/2023求解凸包的算法有好幾種,這里介紹一種最好理解的方法,其他方法各位同學(xué)感興趣的話可以上網(wǎng)搜索資料(Graham算法、快速凸包算法等),這里就不介紹了。這里介紹的算法名字叫做"卷包裹"算法。2/2/2023該算法可以這樣理解:在空地上樹立著一堆木樁,在一個最外側(cè)的木樁綁上一根很長繩子,然后順時針或者逆時針繞一圈。當(dāng)再一次回到這個起點(diǎn)木樁時,可以保證繩子正好卡主了所有外圍的木樁,并得到一個凸包。2/2/2023首先需要找到一個在凸包上的點(diǎn),這里我們可以找最左邊的點(diǎn),如果有多個點(diǎn)滿足條件,可以在這些滿足條件的點(diǎn)中選一個最下面的點(diǎn)。找到后加入凸包。然后以這個點(diǎn)為準(zhǔn)點(diǎn),用向量的叉積找出除這個點(diǎn)以外最外側(cè)的點(diǎn)。并把這個點(diǎn)加入凸包。(如果有多個點(diǎn)滿足條件,如果需要保留凸包上的點(diǎn),則在這些滿足條件的點(diǎn)中選一個最近的。若不保留,則選擇一個最遠(yuǎn)的)。然后用這個新找到的點(diǎn),在進(jìn)行以上步驟。算法的終止條件就是找到的最外側(cè)點(diǎn)為最開始的起點(diǎn)。該算法的時間復(fù)雜度為O(NM)。N為點(diǎn)集中點(diǎn)的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 理財天賦測試題及答案
- 高德java面試題及答案
- 航運(yùn)知識考試題及答案
- 環(huán)境工程風(fēng)險評估與管理試題集匯編
- 未來西方政治制度與非正式政治活動試題及答案
- 學(xué)習(xí)方法多樣化2025年信息系統(tǒng)項(xiàng)目管理師試題及答案
- 軟件測試專家技能要求試題及答案
- 西方國家選舉制度的未來趨勢試題及答案
- 軟件設(shè)計師考試情商提升及試題答案
- 軟件測試工程師日常工作試題及答案
- 2024《整治形式主義為基層減負(fù)若干規(guī)定》全文課件
- 2024年貴州省糧食儲備集團(tuán)有限公司招聘筆試參考題庫附帶答案詳解
- GB/T 13295-2013水及燃?xì)庥们蚰T鐵管、管件和附件
- GB 17565-2007防盜安全門通用技術(shù)條件
- 新生放棄入學(xué)資格申請表(模板)
- 社區(qū)工作聯(lián)系函700字
- 供應(yīng)商服務(wù)商管理辦法
- 天然氣管道運(yùn)輸外文文獻(xiàn)
- 新教材 人教B版高中數(shù)學(xué)必修第四冊 第十一章 立體幾何初步 精品教學(xué)案(知識點(diǎn)考點(diǎn)匯總)
- 營銷策劃工作項(xiàng)目內(nèi)容明細(xì)表
- 人教版六年級畢業(yè)考試卷數(shù)學(xué)講解學(xué)習(xí)
評論
0/150
提交評論