http://apps.hi.baidu.com/share/detail/15350489php
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
- 對數學類題目小結中的題目的簡單解題報告:
- 偶然在網上看到某牛人發的數學題目小結,因而拷了回來作,下面每道題目後面註釋的是我寫的簡單解題報告(有些只是注意事項),並且並不是全部都有作,因此但願你們理解,目前正在更新中。
- 原文鏈接在這裏:http:
- 這裏題目以前有‘ #’ 的表示已過,‘ ?’ 表示作了但還沒過。
-
- 1.burnside 定理,polya 計數法
- 這個你們能夠看brudildi 的《組合數學》,那本書的這一章寫的很詳細也很容易理解。最好能徹底看懂了,理解了再去作題,不要只記個公式。
- * 簡單題:(直接用套公式就能夠了)
- # pku2409 Let it Bead // 翻轉時注意珠子爲奇偶的狀況。
- http:
- # pku2154 Color//LTC 的題目,看《具體數學》p141 ,有個化簡的公式。
- http:
- # pku1286 Necklace of Beads // 和2409 同樣
- http:
- * 強烈推薦:(這題很不錯哦,很巧妙)
- # pku2888 Magic Bracelet // 見月賽解題報告.A[i][j] 爲可達矩陣. 並且注意約數的個數範圍。其中矩陣的冪能夠預先求出全部matrix[2^i] 出來,而後根據二進制來 求。
- http:
- 2. 置換,置換的運算
- 置換的概念仍是比較好理解的,《組合數學》裏面有講。對於置換的冪運算你們能夠參考一下潘震皓的那篇《置換羣快速冪運算研究與探討》,寫的很好。
- * 簡單題:(應該理解概念就能夠了)
- # pku3270 Cow Sorting // 列出置換,而後對於每個置換循環,不斷用環中的最小的那個和其餘的進行換位,能夠獲得最優。另外還有一種狀況就是用整個置換最小的那個和該環進行換位,對於每一個環求出這兩個的最小值加起來就能夠了。
- http:
- # pku1026 Cipher // 先找出全部置換循環,而後對於每一位來計算k% 循環長度後對應於哪一個位置,O(n) 複雜度。注意讀寫方面的東西。
- http:
- * 置換冪運算:
- # pku1721 CARDS // 詳細見05 集訓隊論文《置換羣快速冪運算研究與探討》。
- http:
- # pku3128 Leonardo's Notebook// 摘自:http://blog.csdn.net/J_Factory/archive/2008/08/28 /2845330.aspx
- 題目意思是:一個置換是否能夠由另外一個置換的平方得來的。一個置換的平方,原來偶數長的循環會被分裂成兩段長度相等的循環,而奇數長的循環不會被分裂。題目只是問是否存在,因此只要看所給置換中偶數長的循環是否成對,不然就不能由一個置換的平方得來。
- 補充:由於若是所給置換的循環是偶數,則確定是由分裂過來的,那麼必定是成對的,不然若是是奇數,那麼有多是原來是奇數,也有多是原來的偶數分裂成兩個奇數循環。
- http:
- * 推薦:(不錯的應用)
- # pku3590 The shuffle Problem // 把n 分解成若干個數,使得他們的lcm 最大。在所取的數都是素數冪的時候是最大的,因此能夠用遞歸來枚舉全部的分解狀況,並且因爲要輸出序最小的,因此對於剩下的數能夠直接單獨都做爲一個循環,這樣就可使得序最小了。此外,這道題目須要注意求最大的lcm 的時候不能用dp 來作,由於這個具備後效 性,局部最優不必定使得全局最優。
- http:
- 3. 素數,整數分解,歐拉函數
- 素數是可能數論裏最永恆,最經典的問題了(咱們的隊名就叫PrimeMusic^-^ )。素數的判斷,篩法求素數,大素數的判斷··· 還有不少其餘問題都會用到素數。
- * 最水最水的:(心情不爽時用來解悶吧)
- # pku1365 Prime Land
- # pku2034 Anti-prime Sequences// 直接搜索,用DL 優化會快不少。
- # pku2739 Sum of Consecutive Prime Numbers
- pku3518 Prime Gap
- pku3126 Prime Path
- pku1595 Prime Cuts
- pku3641 Pseudoprime numbers
- pku2191 Mersenne Composite Numbers
- pku1730 Perfect Pth Powers
- pku2262 Goldbach's Conjecture
- pku2909 Goldbach's Conjecture
- * 篩法:
- # pku2689 Prime Distance (很好的一個應用)// 先找出sqrt(2^32) 內的全部素數,而後相似篩選法篩選掉[l,u] 範圍內的數
- http:
- * 反素數:
- # zoj2562 More Divisors //waing... 後記:素數表少打了一個19 ~暈死啊~。。
- http:
- * 素數判斷,整數分解:
- 這兩題都要用到miller_rabin 的素數判斷和pollard_rho 的整數分解,算法書上都會有,應該是屬於模板題吧,不過最好看懂本身敲一 遍。
- # pku1811 Prime Test // 學習miller 和pollard 的題目。
- http:
- # pku2429 GCD & LCM Inverse // 分解lcm/gcd 爲互質的p,q ,要用到Miller Rabin 和Pollard rho 算法,基本上作出來以後都是模板題了。
- http:
- * 歐拉函數:
- 數論裏不少地方都能用到歐拉函數,很重要的。
- # pku1284 Primitive Roots (很水)// 定理:對於奇素數m, 原根個數爲phi(phi(m)), 因爲phi(m)=m-1, 因此爲phi(m-1)
- http:
- # pku2407 Relatives (很水)
- http:
- # pku2773 Happy 2006 //n 以後的互質的數都是n 以前的加上n 的倍數的。
- http:
- # pku2478 Farey Sequence (快速求歐拉函數)// 求前n 個歐拉函數的和,用學習指導裏面的n*(1+lnln(n)) 的算法就能夠了,很是快。
- http:
- # pku3090 Visible Lattice Points (法雷級數)
- http:
- * 推薦:(歐拉函數,費馬小定理)
- # pku3358 Period of an Infinite Binary Expansion// 轉化爲高次同餘方程。
- http:
- * 整數分解
- 這個也很重要的耶,包括大數的表示方法。
- # pku2992 Divisors// 注意預處理,有不少組數據.
- http:
- ? fzu1753 Another Easy Problem
- http:
- hit2813 Garden visiting
- http:
- ? pku3101 Astronomy (分數的最小公倍數)
- http:
- 4. 擴展歐幾里得,線性同餘,中國剩餘定理
- 這應該是數論裏比較重要的一個部分吧,這類的題目也挺多,具體的內容最好先看看數論書,我也整理過一些,能夠參考參考:
- http:
- * 簡單題:
- # pku1006 Biorhythms // 注意最後結果爲0 或負數的狀況
- http:
- # pku1061 青蛙的約會
- http:
- # pku2891 Strange Way to Express Integers //x==a1(mod m1),x==a2(mod m2), 兩個方程能夠求出x ,而後從新令a1 爲求出的解x,m1=lcm(m1,m2) ,而後繼續和後面的進行求解。注意數據運算過程當中可能溢出的問題。
- http:
- # pku2115 C Looooops
- http:
- # pku2142 The Balance // 枚舉,x=x0+b/d*t ,直到x>min(x+y)
- http:
- * 強烈推薦:
- # sgu106 The equation // 求ax+by=c 的時候,考慮a,b 爲零的特殊狀況,此外,若a,b 不是非負數,那麼擴展歐幾里德會有問題,因而咱們能夠把求x,y 變爲求 x'=-x,y'=-y ,此時a,b, 就能夠變爲非負數來處理,同時x',y' 的範圍也要相應取反。並且在取得區間時候,要注意區間邊緣要進行相應的取 整。後記:要用cin,cout 才能AC ,用printf 會wa 。。。極度無奈中,偶然才發現的~_ ~!
- http:
- # pku3708 Recurrent Function (經典)// 具體數學第一章。對於每一位求出循環節m1 ,還有該位從m 達到k 最少要通過r1 次標號變化,因而就能夠獲得x==r1 (mod m1) ,而後一樣的方法求其餘的位,接着就能夠兩兩方程這樣解中國剩餘定理。
- http:
- 5. 約瑟夫環問題
- 這個問題仍是比較有意思的,不是很難。
- * 簡單題:
- # pku3517 And Then There Was One
- http:
- # pku1781 In Danger
- http:
- # pku1012 Joseph // 考慮剩下k+1 我的,那麼上一個出局的人確定是壞人,因此考慮接下來必定要最後一個壞人出局,因此m==0 或1(mod k+1) 。而後枚舉m ,再驗證。
- http:
- # pku2244 Eeny Meeny Moo
- http:
- * 推薦:
- # pku2886 Who Gets the Most Candies?// 線段樹+ 反素數。
- http:
- 6. 高斯消元法解方程
- 其實解方程並非很難,就是按線性代數中學的那種方法,把係數矩陣化成上三角矩陣或數量矩陣,不過有些題目要判斷是否有解,或枚舉全部解。不過這類題目我認爲比較難的仍是怎麼去創建這個方程組,這個理解了,就沒什麼大問題了。
- * 簡單題:
- # pku1222 EXTENDED LIGHTS OUT // 解異或運算的方程。n*m 個方程和未知數。
- http:
- # pku1681 Painter's Problem
- http:
- # pku1830 開關問題 // 以上三題作法都同樣。
- http:
- * 推薦:
- # pku2947 Widget Factory // 最好要化成嚴格的階梯型,方便判解。並且模某個數的時候解方程要用到擴展歐幾里德算法。
- http:
- # pku2065 SETI// 與上題同樣。
- http:
- * 強烈推薦:
- # pku1753 Flip Game // 數據範圍比較小,枚舉可過。若是用高斯消元作,那麼對於多解的時候也是須要枚舉的,並且這種類型不具備太大的擴展性,這裏高斯消元不見的比枚舉要優越。
- http:
- # pku3185 The Water Bowls // 一樣若是對於無數解的時候,就須要對解進行枚舉。其實這道題目能夠先枚舉第一位是否須要翻轉,而後其餘的就已經肯定了,不過須要注意若是第一位翻轉的時候,答案別忘了加上去,我由於這個搞了很久~~~鬱悶。
- http:
-
- pku1395
- pku2055
- ural1561
- pku3254
- * 變態題:
- pku1487 Single-Player Games
- http:
- 7. 矩陣
- 用矩陣來解決問題確實很常見,但我如今用到還不是很好,不少難題我還不會作。建議你們能夠去看Matrix67 的那篇關於矩陣的十個問題,確實很經典, 但不太好看懂。
- * 簡單:
- pku3070 Fibonacci
- http:
- pku3233 Matrix Power Series
- http:
- pku3735 Training little cats
- http:
- 8. 高次同餘方程
- 有關這個問題我應該是沒什麼發言權了,A^B%C=D ,我如今只會求D 和B ,唉,很想知道A 該怎麼求。就先推薦幾道題目吧,這裏涉及到了一個baby- step ,giant-step 算法。
- # fzu1759 Super A^B mod C //a^b%c=a^(b%phi(c))%c , 注意a==c 的狀況,
- http:
- # pku3243 Clever Y // 和上面差很少,不過c 不必定是素數,因此方法就是解出a^m*x+c*y=gcd(a^m,c) 的全部解來判斷,若無解則無論,由於c 不是素數可能 a^m 沒有逆。
- http:
- # pku2417 Discrete Logging //hash ,最直接的離散對數
- http:
- ? hdu2815 Mod Tree
- http:
- # sgu261 求A wa test 23.. 後記:原來是hash 有錯誤,由於用了vector 後是從0 開始的,而我判斷hash 鏈表結束的是0 ,若是剛好最後一個是在vector 的0 位 置,那麼就會忽略掉這個數據,因此就會出現找不到那個數的狀況。另外進行最後答案輸出的時候,vector 的size ()是返回unsigned int 的,若是size( )是0 ,那麼size()-1 就是2^32-1 了,因此這裏就須要特別注意。
- ? http:
- http:
- 9. 容斥原理,鴿巢原理
- 頗有用的兩個定理,但好像單獨考這兩個定理的不是不少。
- * 鴿巢原理:
- # pku2356 Find a multiple // 同下。
- http:
- # pku3370 Halloween treats////n 個數,尋找c 個(c<=n) ,使得他們的和爲c 的倍數。由抽屜原理,前n 個數的 mod c 確定有重複的,那麼必定存在一個區間使得他們的和是c 的倍數。
- http:
- * 容斥原理:
- # hdu1695 GCD // 求gcd(x,y)=k 的個數,至關於求gcd(x/k,y/k)=1 的個數,其中x/k 在[a/k,b/k],y/k 在[c/k,d/k] 之間。所 以就是求在必定區間內,x ,y 互質的對數。假設b<d, (此處b,d 已除k )那麼對於<=b, 直接用歐拉函數就能夠了,對於[b+1,d] 之 間的數,對於每個分解質因數,而後利用容斥原理,求出[1,b ]之間和這個數互質的個數。注意最後答案可能超過int ,用I64d 輸出。
- http:
- # hdu2461 Rectangles // 對稱狀況下才能使用懶標記,並且覆蓋的標號不向下傳。另外在pku3695 上一樣的題目因爲時限很緊,因此能夠對座標進行離散化。log1000 和 log40 仍是有差異的。
- http:
- 10. 找規律,推公式
- 這類題目的設計通常都很是巧妙,真的是很難想出來,但只要找到規律或推出公式,就不是很難了。我不少都是在參考別人思路的狀況下作的,能本身想出來真的很不容易。
- * 我的感受都挺不錯的:
- # pku3372 Candy Distribution// 找規律。。。其實能夠進行分析的。
- http:
- # pku3244 Difference between Triplets// 這道題目要用到一個很巧妙的轉化,把比較轉化爲絕對值的計算。由於max(a,b,c)-min(a,b,c)=(|a- b|+|a-c|+|b-c|)/2, 而後剩下的就容易作了。
- http:
- pku1809 Regetni
- http:
- pku1831 不定方程組
- http:
- # pku1737 Connected Graph //f[n] 爲n 個點的聯通數,那麼f[n]=2^(c[n][2])-sigma(f[k]*c[i-1][k-1]*2^(c[n-k][2]))
- http:
- # pku2480 Longge's problem//sigma(gcd(i,n))=sigma(d|n && d*[gcd(i,n)==d]), 枚舉全部n 的約數d ,而後對於n/d ,找出全部和n/d 互質的數的個數就是gcd(i,n)==d 的個數,從而用歐拉 函數解決。
- http:
- pku1792 Hexagonal Routes
- http:
- 11. 排列組合,區間計數,計數序列
- 這些題目可能須要一些組合數學知識,基本上高中的知識就夠了。區間計數問題通常不難,但寫的時候須要仔細一些,各類狀況要考慮到位。至於像卡特蘭數,差分序列,斯特靈數··· 都還挺有意思,能夠去看看《組合數學》。
- * 簡單題:
- pku1850 Code
- http:
- pku1150 The Last Non-zero Digit
- http:
- pku1715 Hexadecimal Numbers
- http:
- pku2282 The Counting Problem
- http:
- pku3286 How many 0's?
- http:
- * 推薦:
- pku3252 Round Numbers
- http:
- * 計數序列:
- pku1430 Binary Stirling Numbers
- http:
- pku2515 Birthday Cake
- http:
- pku1707 Sum of powers
- http:
- 12. 二分法
- 二分的思想仍是很重要的,這裏就簡單推薦幾個純粹的二分題。
- * 簡單:
- pku3273 Monthly Expense
- http:
- pku3258 River Hopscotch
- http:
- pku1905 Expanding Rods
- http:
- pku3122 Pie
- http:
- * 推薦:
- # pku1845 Sumdiv // 令a=p1^m1 * p2^m2 * ... * pk^mk, 那麼因爲因數和是一個積性函數,
- 因此 f(a)=f(p1^m1)*f(p2^m2)*.. ; f(x^t)=1+x+x^2+..+x^t=(1-x^(t+1))/(1-x);
- 因爲mod 某個數,因此能夠1/(1-x) 能夠用同餘數解決。不過注意若是MOD | x-1, 那麼 f(x^t)=t+1 特殊處理一下。
- http:
- 13. 穩定婚姻問題
- 無心中接觸到這個算法,還蠻有意思的,《組合數學》中有詳細的介紹。
- pku3487 The Stable Marriage Problem
- http:
- zoj1576 Marriage is Stable
- http:
- 14. 數位類統計問題
- 在航點月賽中第一次接觸到這類問題,scau 大牛little 龍推薦我看了一篇論文,09 年劉聰的《淺談數位類統計問題》,這篇論文至關精彩,也至關詳 細,每道題都有詳細的分析和做者的參考代碼。因此我也沒什麼可說的了,這些題的代碼我博客裏也就不貼了,你們直接去看論文吧。
- 簡單:
- ural1057 Amount of degrees
- http:
- spoj1182 Sorted bit squence
- https:
- hdu3271 SNIBB
- http:
- 較難:
- spoj2319 Sequence
- https:
- sgu390 Tickets
- http:
- 以上分類的題目在個人博客裏均可以找到詳細的解題報告和參考代碼,因爲比較麻煩就沒加連接,須要的能夠用個人站內搜索找到。
- 本小結會不斷更新,轉載請註明出處。
- 歐拉函數。
- # pku 3696 The Luckiest number
-
- http:
- 樹狀數組
- # hdu 3333
- 先求出每一個位置後面和它同樣的最近的那個數的位置next[i] ,而後用樹狀數組記錄不重複的前n 個數的和,接着對詢 問區間排序,從左到右作,記left 爲在當前區間左邊的那些數,經過樹狀數組,將left 到next[left]-1 之間的全部的數都減去 val[left] ,而後就能夠直接像sum[i]-sum[j] 那樣方便的求出區間裏面沒有重複的數的和。
- http:
- # pku 3222 // 樹的dfs 和分治思想
- 解題報告見此:http:
- 本文來自CSDN博客,轉載請標明出處:http:
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
- pku 1150 The Last Non-zero Digit
- 和計算排列數末尾有多少個零有些相似,把2,5因子都拿出來,剩下的數的最後一個數字只有1,3,7,9。只有各位上的數字纔會影響最後一個非零數字。統計能夠用遞歸來統計,求出1~n中因子2,5的個數,以及3,7,9結尾的數和去掉2,5後新的到的數中3,7,9結尾的數。結果就是 2^(dig[2]-dig[5])*3^(dig[3])*7^(dig[7])*9^(dig[9]) mod 10 ,用快速冪乘來算。
- pku 1186 方程的解數 (hash,枚舉)
- 題目給出最多有6個未知數,未知數的取值在[1,150]之間,直接枚舉時間複雜度是150^6,這個時間不能接受。枚舉前一半的未知數能夠到達的值(用hash表保存),再枚舉後一半,這樣能夠加快枚舉。
- pku 1285 Combinations, Once Again(有重複的組合,dp)
- 對輸入的數先統計一下,每一個數出現的次數。若是每次重複的數,輸出c[n][m]就能夠。有重複數時,要考慮到取相同元素的狀況,那麼ans=sigma c[x][i]*z[s][m-i] 0<i<=m z[i][j]表示從1到第i堆中拿j個,把重複的數字表示成a[1],a[2]..,a[s],s個數出現重複。注意幾個邊界條件,c[0][0]=1,z[1][0...a[1]]=1,z[i][1]=i 2<=i<=s。
- pku 1430 Binary Stirling Numbers (stirling 數)
- 在wiki上找到公式,原來mod 2時和組合數有關係。原文以下:
- Using a Sierpiński triangle, it's easy to show that the parity of a Stirling number of the second kind is equal to the parity of a related binomial coefficient:
- Or directly, let two sets contain positions of 1's in binary representations of results of respective expressions:
- then mimic a bitwise AND operation by intersecting these two sets:
- to obtain the parity of a Stirling number of the second kind in O(1) time.
- pku 1465 Multiple(BFS,整除)
- 給幾個一些數學,找出由這些數字組成的數中最小的一個能整除n的數。0<n<4999,把全部的數從小到大開始,在入隊列前看下該數所到達的餘數是否被前面小的數求到過,若否才入隊。這樣搜索的空間就只有n的剩餘繫了。
- pku 1715 Hexadecimal Numbers(組合)
- 不重複的組合問題,知道第幾個找出這個組合。從最高位開始,一位一位肯定dfs下去,每次都要保證已肯定的位的全部組合很多於題目給出的序號。最多八層。
- pku 1737 Connected Graph(組合數學,高精度)
- 題目是求n個點用邊連接,造成聯通圖的方案總算。知足聯通的邊數在[n-1,n(n-1)/2],本身一開始想分邊數狀況考慮,發現狀況比較複雜,推出一個像整數拆分的方法。還來在網上看到一種更好的解法。公式是f[n]=f[k]*f[n-k]*c[n-2][k-1]*((2^k)-1) (c[n-2][k]表示組合數,1<=k<n);考慮一個完整的聯通圖,能夠標記兩個點1,2。將點1,點2分別劃分在兩個子聯通圖中分別爲g1,g2。在g1中最少要有一個點與g2中的點2連接。這樣的方式共2^k-1中,而g1總有c[n-2][k-1]個。將他們乘在一塊兒就有了上面的式子。另外這題要用到高精度,終於用java寫了個高精度的題感受真方便。
- pku 1845 Sumdiv(積性函數,因子和)
- 求a^b的因子和(包括1和a^b),因爲因子和是積性函數。因此f(a^b)=f(p1^t1)*f(p2^t2)...*f(pn^tn),對於f(p^t)的狀況:
- f(p^t)=1+p+p^2+...+p^t=(p^(t+1)-1)/p-1。題目還要求mod 9901,這雖然是個素數,可是數據中出現了p-1 = 0 (mod 9901)的狀況,這時f(p^t)=t+1 (mod 9901),要特殊處理下,其他用快速冪乘。
- pku 1809 Regetni(奇偶,組合)
- 根據 這個公式計算 A=|x1y2 - y1x2 + x2y3 - y2x3 + x3y1 - y3x1|/2 三角形的面積是否爲整數。這題不要去算具體的面積,答案和所選點的奇偶性有關,點的只有4種類型,(0,0),(1,1),(1,0),(0,1)。把這4類點的全部組合狀況(共20種)代入公式
- 發現,當最少有兩個點屬於同一類型是面積纔是整數。那麼只有統計出全部點的組合狀況就能夠得出答案了。點的組合狀況
- {0,1,2},{0,1,3},{0,2,3},{1,2,3},{0,1,1},{0,2,2},{0,3,3},{1,0,0},{1,2,2},{1,3,3},{2,0,0},{2,1,1},{2,3,3},
- {3,0,0},{3,1,1},{3,2,2},{0,0,0},{1,1,1},{2,2,2},{3,3,3} 這些是合理的組合。
- pku 1831 不定方程組(構造解)
- 這個題目頗有意思,說a1+a2..an=s,1/a1+1/a2....+1/an=1;求一組這樣的解。
- 爲了找S的一組解,能夠把S變小,來獲得S的解。兩種變小的方法:p/2+1/2=1 ,p*2+2=S;或p/2+1/3+1/6=1,p*2+9=S;選這兩種方式是爲了使奇數,偶數都有變小的方法。更重要的是當S必定大時,必定會有解。證實能夠經過概括來證得。因此事先保留一些小的S的解。大的S經過遞歸的構造出解來。
- pku 2142 The Balance(不定方程)
- 不定方程題,解a*x+b*y=d 。先求a*x0+b*y0=k。a/=k,b/=k,d/=k; 獲得等價方程a'*x+b'*y=d',通常解爲x=x0-b'*t,y=y0+a't;其中t爲任意整數。
- pku 2154 Color(波利亞定理,着色問題)
- 一個經典的着色問題,題目描述的是一個正常的旋轉羣,它的輪換指標爲1/n*sigma(euler(d)*(xd)^(n/d)) ,其中d爲n的全部因子。有了這個生成函數就能夠容的計算n種顏色,在正n邊形上着色的不一樣方案數了。
- pku 3352 In Danger(約瑟夫環)
- 簡單題,和具體數學第一章提到的問題是同樣的,講每數2去掉一人,求勝利人的編號。公式是
- f(n)=f(n/2)*2-1 n=2*k
- f(n)=f(n-1/2)*2+1 n=2*k+1
- pku 2282 The Counting Problem(計數統計)
- 一個計算問題,統計a,b之間0-9這些數字出現的次數。能夠分別計算f(b),f(a-1)的大小,其中 a<b f(n)表示1到n數字出現的統計。對於f(n) ,能夠按位計算,從個位到n的最高位,分別計算0-9的個數,0的計算有些特殊,由於0不能是一個數字的最高位
- while(a>=times)
- {
- len=a/(times*10);
- for(i=0;i<10;i++)aa[i]+=len*times;
- if(len>0)aa[0]-=times;
- tmp=(a/times)%10;
- if(a>=times*10)start=0;else start=1;
- for(i=start;i<tmp;i++)aa[i]+=times;
- aa[tmp]+=a%times+1;
- times*=10;
- }
- pku 2429 gcd lcm Inverse
- 大數分解,要分解的數很大,到了2^63,普通的素數表方法行不通,要使用Pollard分解,分解lcm/gcd。須要注意的是會出現lcm==gcd的狀況。
- pku 2769 Reduced ID Numbers(同餘)
- 給出n個數,找一個數p,使得沒個數mod p的值不相等。即n個數mod p不一樣餘。先求出任意兩個數的差(要正的),找個最小的數,使其不是前面求的差的約數。
- pku 2891 Strange Way to Express Integers(解模線性方程組)
- 這題是解個同餘方程組,既解x= ai (mod bi) ,題目沒有保證bi之間兩兩互素,因此中國剩餘定理,在這裏沒用。能夠經過先求
- 兩個方程的解,這樣就將兩個方程和併成一個,直達只剩下一個爲止就能夠的到答案了。在合併的過程當中有不能合併的狀況出現就
- 說明整個方程組沒有解。c=a1 (mod b1),c=a2 (mod b2) c=a1+b1*x, a1+b1*x= a2 (mod b2),用擴展歐幾里德求出c。兩個方程就
- 能夠用 c'= c (mod lcm(b1,b2))表示。
- hdu 1792 A New Change Problem
- 題是說:給兩個互質的數,要求出兩個數所不能組合出的正整數。在較大數的每個等價類中找出最小的一數,它是較小數的倍數,那麼在這個等價類中小於這個數的都是不能被表示出來的。最大的一個不能被表示出來的數是(n-1)*m-n 其中n>m,因爲n有n個等價類,一個類包含不可表示出的數是m-1,老是是(n-1)*(m-1)/2
- pku 2888 Magic Bracelet(帶約束的着色問題)
- 這題仍是要用到波利亞定理,惟一的不一樣是計算矩陣的冪模,再求矩陣的跡。具體的推導就不知道是怎麼來的。關於矩陣是指容許相鄰的兩種顏色之間有邊,這就造成了個無向圖。矩陣的n冪模,和快速冪乘的原理是同樣的。
- pku 2917 Diophantus of Alexandria(不定方程,因數分解)
- 模擬下後發現,知足1/x+1/y=1/z的x,y是z的約數,而且x,y互素。統計x,y的對數再加1(x=z,y=z是特殊的一對)。
- 後來看到討論裏有公式,(x-z)(y-z)=z^2,計算小於z,並是z^2的約數就是答案了。
- pku2992 Divisors (組合數,因子個數)
- 計算C(n,k)的因子個數,因爲n很小,最大爲431,因此能夠把1~431的全部數先因式分解,再來統計n*(n-1)...(n-k+1)/k*(k-1)...1的素因子個數。
- pku 3370 Halloween treats(鴿巢原理)
- 給定m個整數a1,a2,a3,..,am,存在整數k和l,0<=k<l<=m,使得ak+1 + ak+2 + ... +al可以被m整除。也就是說存在連續的一段al,...am,之和被m整除。考慮從a1...ai的和si,一定有si%m==0 或 si = sj (mod m),這種狀況下取ai+1...aj,這段之和會是m的倍數。
- pku 3128 Leonardo's Notebook(置換)
- 題目意思是:一個置換是否能夠由另外一個置換的平方得來的。一個置換的平方,原來偶數長的循環會被分裂成兩段長度相等的循環,而奇數長的循環不會被分裂。題目只是問是否存在,因此只要看所給置換中偶數長的循環是否成對,不然就不能由一個置換的平方得來。
- pku 3244 Difference between Triplets(公式變形)
- 很巧妙的公式變形,惋惜不本身想出來的。首先計算max(a,b,c)-min(a,b,c)=(|a-b|+|b-c|+|a-c|)/2,有了這個公式就能夠把比較變成加。那麼
- D(Ta, Tb) = max {Ia − Ib, Ja − Jb, Ka − Kb} − min {Ia − Ib, Ja − Jb, Ka − Kb}
- =(|Ia-Ib-Ja+Jb|+|Ja-Jb-Ka+Kb|+|Ia-Ib-Ka+Kb|)/2
- 令Ia-Ja=Wa,Ja-Ka=Ua,Ia-Ka=Ha;
- =(|Wa-Wb|+|Ua-Ub|+|Ha-Hb|)
- 將讀入的數據轉化W,U,H三個數組,分別計算這三個數組任意兩個元素的差的絕對值之和。這裏要用小於O(n^2)的算法,把數組排序後能夠拿掉絕對值,統計每一個元素做爲減數出現的次數。
- pku 3324 Lucas-Lehmer Test(模運算)
- 首先要用到高精度,用java很方便。在計算模的時候,因爲是mod 2^p-1,能夠用移位來加速。
- a=r (mod 2^p-1) => a=k*(2^p-1)+r,先算個打概的k,獲得的r>2^p-1,繼續減2^p-1。這樣比直接模運算要快。
-
- pku 3372 Candy Distribution(二次剩餘系)
- 根據題目的意思能夠獲得方程 1+n(n+1)/2 =a (mod N),顯然這是一個二次模方程。要看N的二次徹底剩餘系是否都有解。
- 結論是N要是2^x,x>=0,結論的證實還不知道。
- pku 3516 Hide That Number(高精度)
- 題目是說給出一個數y,找到 x*11= y (mod 10^length(y)),若是y很小,直接求出逆來就能獲得答案了,但是y很大,構造的方法沒有想到,最後仍是暴力作的。每次在y的前面加個數學(1,2..9),或是加上10這兩個數字,看新獲得的數字是11的倍數。如果,就能夠獲得答案了。因爲y很大,普通的高精度會超時,要增長進制。
- pku 3847 The Stable Marriage Problem(穩定婚姻)
- 穩定婚姻問題。用到了延遲承認算法。用最優方提出匹配,而被匹配者,不會當即接受,而是在提出要求者的集合中去掉,比當前着差的元素,知道沒有人提出匹配,被匹配者才肯定下匹配關係。值得一提的是,穩定婚姻的存在性不能被保證。
- pku 3358 Period of an Infinite Binary Expansion(數論,歐拉定理)
- 這個題目是求兩個數相除p/q,結果的小數部分用二進制表示,當q不是2的冪時,這個二進制是個無線循環的01串。
- 下面是個模擬小數部分按二進制表示,能夠發現二進制傳必定會有循環,由於p=p%q,既然是循環,又是模運行,這和p模q的階有關,p%q的階必定是q的歐拉函數的因子。這樣轉換成一個模方程:p*2^n = x(mod q),固然p和q要互素,2和q互素。在計算前把q中的2去掉,p,q同除最大公因數。而後從1開始枚舉,因此的歐拉數的因子。
- #include <stdio.h>
- #define pr printf
- int main()
- {
- int i,p,q;
- while(scanf("%d%d",&p,&q)==2){
- pr("0.");
- for(i=1;i<=100;i++)
- {
- p*=2;
- pr("%d",p/q);
- p=p%q;
- }
- pr("/n");
- }
- }
-
-
-
-
-
- pku 3590 The shuffle Problem(置換,數的分解)
- 題目求一個排列經過置換以後再回到原來的那個排列,對於給定的排列求出一個知足置換次數最多的一個置換。一個置換能夠分解成多個循環,每次置換元素之和在同一個循環中的元素髮生轉換,同一個循環中循環節是元素的個數,因此這個題是要把一個數分紅多個數的和,讓這些數的最小公倍數最大。要保證lcd最大應該分解出來的每一個數兩兩互素。因爲數比較小,23是能最大的素數,因此直接枚舉能夠知足。
- pku 3641 Pseudoprime numbers(費馬定理,快速冪乘)
- 簡單題,先看p是不是素數,如果直接輸出no。不然計算(a^p)%p,若結果是a輸出yes,不然輸出no。
- 2008哈爾濱賽區網絡預選1007 The Luckiest number(歐拉定理運用)
- 題目說要找個數t,它的數字全是8,對於給定的n,t要是n的整數倍,求最小的t。
- 賽後才發現這題並不拿,多是我太菜了。這題問題能夠轉換成8*(10^x-1)/9 = 0 (mod n ),這樣就能夠看出還有因子5和16的n是沒有解的。而且n是偶數時,其解是n除去2因子的解。最後就是求解 10^x = 1 (mod 9*n) n是一個奇數,因此(10,n)=1,這樣就能夠根據歐拉定理 ,知足等式的解只能是 euler(9*n)的因子。枚舉歐拉數的因子,最小的那個就是要求的解。因爲n能夠到2000000000,快速冪乘要支持64位運算。
- 2008 成都網絡預選 1005 Farey Sequence Again(Farey Sequence ,構造)
- 與其說是數學題,還不如說是個模擬題。Farey Sequence序列規律性很強,暴力模擬後發現有不少規律。要用到的一個性質是
- Fn中連續的3個元素,a1/b1 ,a2/b2,a3/b3。若a1+a3<n 而且 b1+b3<=n ,則 a2=a1+a3,b2=b1+b3。這個性質頗有用,根據它能夠推出序列中前n項的分子不超過3,並且在構造的時候也要用到這個性質,找個第一個分母是2和3的元素的位置,均可以經過觀察看出規律。序列就分紅了3段,第一段分子只有1,第二段分子有1和2,並且是2,1,2,1,2,。。。這樣循環的。第三段有1,2,3,也會出現循環,或是3,1,3,2 或是3,2,3,1這樣的循環結。因此的規律均可以在模擬的序列中看出。只有3爲分子時看不出規律,可是這樣的元素左右兩個必定是分子爲1和2的兩個元素,根據性質,知道3周圍的兩個元素的分母,就能夠得出分子爲3的元素的分母
- 2008 哈爾濱現場賽 Simple Addition Expression hdu2451
- 經過讀題發現知足要求的數字,最高位由1,2,3組成,最低位由0,1,2組成,中間由0,1,2,3組成。計算小於n的數有多少個這種數就是答案。
- 2008 哈爾濱現場賽 K-dimension number hdu2447
- 讀題後發現K要麼是p,要麼是p^2 (p爲素數),且p<=97,K維數n的狀況只有三種。
- 一,當k爲p時,n=(p')^(p-1)
- 二,當k爲p^2時,n=(p1')^(p-1)*(p2')^(p-1)或n=(p1')^(p^2-1)
- 三,當k爲1是,n=1。
- zoj 2562 More Divisors(反素數,dp)
- 反素數是指在不大於n數中含有最多約數,值最小的一個,好比2,4,6。。都是反素數。題目要求在小於10^16中的反素數。
- 因爲反素數要求約數儘可能多,因此素因子個數要儘可能少,而指數要儘可能大,這樣一個數成爲反素數的機會就大。因此只要考慮前13個素數所能組成的數就能夠。轉移方程
- f[i][j]= min{f[i-1][j/(k+1)]*p(i)^k}
- f[i][j] 表示i個素數,有j個約數的最小值。p(i)表示第i個素數,j%(k+1)==0
- 要注意的地方: j不超過50000。