1. 程式人生 > >【ACM訓練計劃】 數論、組合數學 好題精選+解題報告

【ACM訓練計劃】 數論、組合數學 好題精選+解題報告

對數學類題目小結中的題目的簡單解題報告:
     偶然在網上看到某牛人發的數學題目小結,於是拷了回來做,下面每道題目後面註釋的是我寫的簡單解題報告(有些只是注意事項),而且並非所有都有做,所以希望大家理解,目前正在更新中。
     原文連線在這裡:http://hi.baidu.com/%B1%BF%D0%A1%BA%A2_shw/blog/item/5305e12c7289973e359bf768.html
     這裡題目之前有‘ #’ 的表示已過,‘ ?’ 表示做了但還沒過。

    1.burnside 定理,polya 計數法
     這個大家可以看brudildi 的《組合數學》,那本書的這一章寫的很詳細也很容易理解。最好能完全看懂了,理解了再去做題,不要只記個公式。
    * 簡單題:(直接用套公式就可以了)
#    pku2409 Let it Bead    // 翻轉時注意珠子為奇偶的情況。
    http://acm.pku.edu.cn/JudgeOnline/problem?id=2409 
#    pku2154 Color//LTC 的題目,看《具體數學》p141 ,有個化簡的公式。
    http://acm.pku.edu.cn/JudgeOnline/problem?id=2154 
#    pku1286 Necklace of Beads  // 和2409 一樣
    http://acm.pku.edu.cn/JudgeOnline/problem?id=1286 
    * 強烈推薦:(這題很不錯哦,很巧妙)
#    pku2888 Magic Bracelet  // 見月賽解題報告.A[i][j] 為可達矩陣. 而且注意約數的個數範圍。其中矩陣的冪可以預先求出所有matrix[2^i] 出來,然後根據二進位制來 求。
    http://162.105.81.212/JudgeOnline/problem?id=2888 
    2. 置換,置換的運算
     置換的概念還是比較好理解的,《組合數學》裡面有講。對於置換的冪運算大家可以參考一下潘震皓的那篇《置換群快速冪運算研究與探討》,寫的很好。
    * 簡單題:(應該理解概念就可以了)
#    pku3270 Cow Sorting  // 列出置換,然後對於每一個置換迴圈,不斷用環中的最小的那個和其他的進行換位,可以得到最優。另外還有一種情況就是用整個置換最小的那個和該環進行換位,對於每個環求出這兩個的最小值加起來就可以了。
    http://acm.pku.edu.cn/JudgeOnline/problem?id=3270 
#    pku1026 Cipher // 先找出所有置換迴圈,然後對於每一位來計算k% 迴圈長度後對應於哪個位置,O(n) 複雜度。注意讀寫方面的東西。
    http://acm.pku.edu.cn/JudgeOnline/problem?id=1026 
    * 置換冪運算:
#    pku1721 CARDS  // 詳細見05 集訓隊論文《置換群快速冪運算研究與探討》。
    http://162.105.81.212/JudgeOnline/problem?id=1721 
#    pku3128 Leonardo's Notebook// 摘自:http://blog.csdn.net/J_Factory/archive/2008/08/28 /2845330.aspx 
   題目意思是:一個置換是否可以由另一個置換的平方得來的。一個置換的平方,原來偶數長的迴圈會被分裂成兩段長度相等的迴圈,而奇數長的迴圈不會被分裂。題目只是問是否存在,所以只要看所給置換中偶數長的迴圈是否成對,否則就不能由一個置換的平方得來。
   補充:因為如果所給置換的迴圈是偶數,則肯定是由分裂過來的,那麼一定是成對的,否則如果是奇數,那麼有可能是原來是奇數,也有可能是原來的偶數分裂成兩個奇數迴圈。
    http://162.105.81.212/JudgeOnline/problem?id=3128 
    * 推薦:(不錯的應用)
#    pku3590 The shuffle Problem  // 把n 分解成若干個數,使得他們的lcm 最大。在所取的數都是素數冪的時候是最大的,所以可以用遞迴來列舉所有的分解情況,而且由於要輸出序最小的,所以對於剩下的數可以直接單獨都作為一個迴圈,這樣就可以使得序最小了。此外,這道題目需要注意求最大的lcm 的時候不能用dp 來做,因為這個具有後效 性,區域性最優不一定使得全域性最優。
    http://162.105.81.212/JudgeOnline/problem?id=3590 
    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://162.105.81.212/JudgeOnline/problem?id=2689 
    * 反素數:
#    zoj2562 More Divisors  //waing... 後記:素數表少打了一個19 ~暈死啊~。。
    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2562 
    * 素數判斷,整數分解:
     這兩題都要用到miller_rabin 的素數判斷和pollard_rho 的整數分解,演算法書上都會有,應該是屬於模板題吧,不過最好看懂自己敲一 遍。
#    pku1811 Prime Test  // 學習miller 和pollard 的題目。
    http://acm.pku.edu.cn/JudgeOnline/problem?id=1811 
#    pku2429 GCD & LCM Inverse  // 分解lcm/gcd 為互質的p,q ,要用到Miller Rabin 和Pollard rho 演算法,基本上做出來之後都是模板題了。
    http://acm.pku.edu.cn/JudgeOnline/problem?id=2429 
    * 尤拉函式:
     數論裡很多地方都能用到尤拉函式,很重要的。
#    pku1284 Primitive Roots (很水)// 定理:對於奇素數m, 原根個數為phi(phi(m)), 由於phi(m)=m-1, 所以為phi(m-1) 
    http://acm.pku.edu.cn/JudgeOnline/problem?id=1284 
#    pku2407 Relatives (很水)
    http://acm.pku.edu.cn/JudgeOnline/problem?id=2407 
#    pku2773 Happy 2006  //n 之後的互質的數都是n 之前的加上n 的倍數的。
    http://162.105.81.212/JudgeOnline/problem?id=2773 
#    pku2478 Farey Sequence (快速求尤拉函式)// 求前n 個尤拉函式的和,用學習指導裡面的n*(1+lnln(n)) 的演算法就可以了,非常快。
    http://162.105.81.212/JudgeOnline/problem?id=2478 
#    pku3090 Visible Lattice Points (法雷級數)
    http://acm.pku.edu.cn/JudgeOnline/problem?id=3090 
    * 推薦:(尤拉函式,費馬小定理)
#    pku3358 Period of an Infinite Binary Expansion// 轉化為高次同餘方程。
    http://acm.pku.edu.cn/JudgeOnline/problem?id=3358 
    * 整數分解
     這個也很重要的耶,包括大數的表示方法。
#    pku2992 Divisors// 注意預處理,有很多組資料. 
    http://acm.pku.edu.cn/JudgeOnline/problem?id=2992 
?    fzu1753 Another Easy Problem// 記得n! 有多少個p 的冪是怎麼求的。
    http://acm.fzu.edu.cn/problem.php?pid=1753 
    hit2813 Garden visiting 
    http://acm-hit.sunner.cn/judge/show.php?Proid=2813 
?    pku3101 Astronomy (分數的最小公倍數)// 高精度gcd ,超時中。
    http://acm.pku.edu.cn/JudgeOnline/problem?id=3101 
    4. 擴充套件歐幾里得,線性同餘,中國剩餘定理
     這應該是數論裡比較重要的一個部分吧,這類的題目也挺多,具體的內容最好先看看數論書,我也整理過一些,可以參考參考:
    http://hi.baidu.com/%B1%BF%D0%A1%BA%A2%5Fshw/blog/item/0676025d56a87d4afbf2c093.html 
    * 簡單題:
#    pku1006 Biorhythms // 注意最後結果為0 或負數的情況
    http://acm.pku.edu.cn/JudgeOnline/problem?id=1006 
#    pku1061 青蛙的約會
    http://acm.pku.edu.cn/JudgeOnline/problem?id=1061 
#    pku2891 Strange Way to Express Integers  //x==a1(mod m1),x==a2(mod m2), 兩個方程可以求出x ,然後重新令a1 為求出的解x,m1=lcm(m1,m2) ,然後繼續和後面的進行求解。注意資料運算過程中可能溢位的問題。
    http://acm.pku.edu.cn/JudgeOnline/problem?id=2891 
#    pku2115 C Looooops 
    http://acm.pku.edu.cn/JudgeOnline/problem?id=2115 
#    pku2142 The Balance // 列舉,x=x0+b/d*t ,直到x>min(x+y) 
    http://162.105.81.212/JudgeOnline/problem?id=2142 
    * 強烈推薦:
#    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://acm.sgu.ru/problem.php?contest=0&problem=106 
#    pku3708 Recurrent Function (經典)// 具體數學第一章。對於每一位求出迴圈節m1 ,還有該位從m 達到k 最少要經過r1 次標號變化,於是就可以得到x==r1 (mod m1) ,然後同樣的方法求其他的位,接著就可以兩兩方程這樣解中國剩餘定理。
    http://acm.pku.edu.cn/JudgeOnline/problem?id=3708 
    5. 約瑟夫環問題
     這個問題還是比較有意思的,不是很難。
    * 簡單題:
#    pku3517 And Then There Was One   
    http://acm.pku.edu.cn/JudgeOnline/problem?id=3517 
#    pku1781 In Danger 
    http://acm.pku.edu.cn/JudgeOnline/problem?id=1781 
#    pku1012 Joseph // 考慮剩下k+1 個人,那麼上一個出局的人肯定是壞人,所以考慮接下來一定要最後一個壞人出局,所以m==0 或1(mod k+1) 。然後列舉m ,再驗證。
    http://162.105.81.212/JudgeOnline/problem?id=1012 
#    pku2244 Eeny Meeny Moo 
    http://162.105.81.212/JudgeOnline/problem?id=2244 
    * 推薦:
#    pku2886 Who Gets the Most Candies?// 線段樹+ 反素數。
    http://162.105.81.212/JudgeOnline/problem?id=2886 
    6. 高斯消元法解方程
     其實解方程並不是很難,就是按線性代數中學的那種方法,把係數矩陣化成上三角矩陣或數量矩陣,不過有些題目要判斷是否有解,或列舉所有解。不過這類題目我認為比較難的還是怎麼去建立這個方程組,這個理解了,就沒什麼大問題了。
    * 簡單題:
#    pku1222 EXTENDED LIGHTS OUT  // 解異或運算的方程。n*m 個方程和未知數。
    http://162.105.81.212/JudgeOnline/problem?id=1222 
#    pku1681 Painter's Problem 
    http://162.105.81.212/JudgeOnline/problem?id=1681 
#    pku1830 開關問題  // 以上三題做法都一樣。
    http://162.105.81.212/JudgeOnline/problem?id=1830 
    * 推薦:
#    pku2947 Widget Factory  // 最好要化成嚴格的階梯型,方便判解。而且模某個數的時候解方程要用到擴充套件歐幾里德演算法。
    http://162.105.81.212/JudgeOnline/problem?id=2947 
#    pku2065 SETI// 與上題一樣。
    http://162.105.81.212/JudgeOnline/problem?id=2065 
    * 強烈推薦:
#    pku1753 Flip Game // 資料範圍比較小,列舉可過。如果用高斯消元做,那麼對於多解的時候也是需要列舉的,而且這種型別不具有太大的擴充套件性,這裡高斯消元不見的比列舉要優越。
    http://162.105.81.212/JudgeOnline/problem?id=1753 
#    pku3185 The Water Bowls // 同樣如果對於無數解的時候,就需要對解進行列舉。其實這道題目可以先列舉第一位是否需要翻轉,然後其他的就已經確定了,不過需要注意如果第一位翻轉的時候,答案別忘了加上去,我因為這個搞了好久~~~鬱悶。
    http://162.105.81.212/JudgeOnline/problem?id=3185 
    // 同類題目,我自己加上去的。
    pku1395 
    pku2055 
    ural1561 
    pku3254 
    * 變態題:
    pku1487 Single-Player Games 
    http://162.105.81.212/JudgeOnline/problem?id=1487   
    7. 矩陣
     用矩陣來解決問題確實很常見,但我現在用到還不是很好,很多難題我還不會做。建議大家可以去看Matrix67 的那篇關於矩陣的十個問題,確實很經典, 但不太好看懂。
    * 簡單:
    pku3070 Fibonacci 
    http://162.105.81.212/JudgeOnline/problem?id=3070 
    pku3233 Matrix Power Series 
    http://162.105.81.212/JudgeOnline/problem?id=3233 
    pku3735 Training little cats 
    http://162.105.81.212/JudgeOnline/problem?id=3735 
    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://acm.fzu.edu.cn/problem.php?pid=1759 
#    pku3243 Clever Y  // 和上面差不多,不過c 不一定是素數,所以方法就是解出a^m*x+c*y=gcd(a^m,c) 的所有解來判斷,若無解則不管,因為c 不是素數可能 a^m 沒有逆。
    http://162.105.81.212/JudgeOnline/problem?id=3243 
#    pku2417 Discrete Logging  //hash ,最直接的離散對數
    http://162.105.81.212/JudgeOnline/problem?id=2417 
?    hdu2815 Mod Tree // 超時中,時限好像挺緊的。
    http://acm.hdu.edu.cn/showproblem.php?pid=2815 
#    sgu261 求A   wa test 23.. 後記:原來是hash 有錯誤,因為用了vector 後是從0 開始的,而我判斷hash 連結串列結束的是0 ,如果恰好最後一個是在vector 的0 位 置,那麼就會忽略掉這個資料,所以就會出現找不到那個數的情況。另外進行最後答案輸出的時候,vector 的size ()是返回unsigned int 的,如果size( )是0 ,那麼size()-1 就是2^32-1 了,所以這裡就需要特別注意。
? http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3538 //handling... 還沒有找出更好的方法解決當a 和p 不互質情況下的解法。
http://202.120.80.191/problem.php?problemid=2700 
    9. 容斥原理,鴿巢原理
     很有用的兩個定理,但好像單獨考這兩個定理的不是很多。
    * 鴿巢原理:
#    pku2356 Find a multiple // 同下。
    http://162.105.81.212/JudgeOnline/problem?id=2356 
#    pku3370 Halloween treats////n 個數,尋找c 個(c<=n) ,使得他們的和為c 的倍數。由抽屜原理,前n 個數的 mod c 肯定有重複的,那麼一定存在一個區間使得他們的和是c 的倍數。
    http://162.105.81.212/JudgeOnline/problem?id=3370 
    * 容斥原理:
#    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://acm.hdu.edu.cn/showproblem.php?pid=1695 
#    hdu2461 Rectangles // 對稱情況下才能使用懶標記,而且覆蓋的標號不向下傳。另外在pku3695 上同樣的題目由於時限很緊,所以可以對座標進行離散化。log1000 和 log40 還是有差別的。
    http://acm.hdu.edu.cn/showproblem.php?pid=2461 
    10. 找規律,推公式
     這類題目的設計一般都非常巧妙,真的是很難想出來,但只要找到規律或推出公式,就不是很難了。我很多都是在參考別人思路的情況下做的,能自己想出來真的很不容易。
    * 個人感覺都挺不錯的:
#    pku3372 Candy Distribution// 找規律。。。其實可以進行分析的。
    http://162.105.81.212/JudgeOnline/problem?id=3372 
#    pku3244 Difference between Triplets// 這道題目要用到一個很巧妙的轉化,把比較轉化為絕對值的計算。因為max(a,b,c)-min(a,b,c)=(|a- b|+|a-c|+|b-c|)/2, 然後剩下的就容易做了。
    http://162.105.81.212/JudgeOnline/problem?id=3244 
    pku1809 Regetni 
    http://162.105.81.212/JudgeOnline/problem?id=1809 
    pku1831 不定方程組
    http://162.105.81.212/JudgeOnline/problem?id=1831 
#    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://162.105.81.212/JudgeOnline/problem?id=1737 
#    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://162.105.81.212/JudgeOnline/problem?id=2480 
    pku1792 Hexagonal Routes 
    http://acm.pku.edu.cn/JudgeOnline/problem?id=1792 
    11. 排列組合,區間計數,計數序列
     這些題目可能需要一些組合數學知識,基本上高中的知識就夠了。區間計數問題一般不難,但寫的時候需要仔細一些,各種情況要考慮到位。至於像卡特蘭數,差分序列,斯特靈數··· 都還挺有意思,可以去看看《組合數學》。
    * 簡單題:
    pku1850 Code 
    http://162.105.81.212/JudgeOnline/problem?id=1850 
    pku1150 The Last Non-zero Digit 
    http://162.105.81.212/JudgeOnline/problem?id=1150 
    pku1715 Hexadecimal Numbers 
    http://162.105.81.212/JudgeOnline/problem?id=1715 
    pku2282 The Counting Problem 
    http://162.105.81.212/JudgeOnline/problem?id=2282 
    pku3286 How many 0's? 
    http://162.105.81.212/JudgeOnline/problem?id=3286 
    * 推薦:
    pku3252 Round Numbers 
    http://162.105.81.212/JudgeOnline/problem?id=3252 
    * 計數序列:
    pku1430 Binary Stirling Numbers 
    http://162.105.81.212/JudgeOnline/problem?id=1430 
    pku2515 Birthday Cake 
    http://acm.pku.edu.cn/JudgeOnline/problem?id=2515 
    pku1707 Sum of powers 
    http://acm.pku.edu.cn/JudgeOnline/problem?id=1707 
    12. 二分法
     二分的思想還是很重要的,這裡就簡單推薦幾個純粹的二分題。
    * 簡單:
    pku3273 Monthly Expense 
    http://162.105.81.212/JudgeOnline/problem?id=3273 
    pku3258 River Hopscotch 
    http://162.105.81.212/JudgeOnline/problem?id=3258 
    pku1905 Expanding Rods 
    http://162.105.81.212/JudgeOnline/problem?id=1905 
    pku3122 Pie 
    http://162.105.81.212/JudgeOnline/problem?id=3122 
    * 推薦:
#    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://acm.pku.edu.cn/JudgeOnline/problem?id=1845 
    13. 穩定婚姻問題
     無意中接觸到這個演算法,還蠻有意思的,《組合數學》中有詳細的介紹。
    pku3487 The Stable Marriage Problem 
    http://acm.pku.edu.cn/JudgeOnline/problem?id=3487 
    zoj1576 Marriage is Stable 
    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1576 
    14. 數位類統計問題
     在航點月賽中第一次接觸到這類問題,scau 大牛little 龍推薦我看了一篇論文,09 年劉聰的《淺談數位類統計問題》,這篇論文相當精彩,也相當詳 細,每道題都有詳細的分析和作者的參考程式碼。所以我也沒什麼可說的了,這些題的程式碼我部落格裡也就不貼了,大家直接去看論文吧。
     簡單:
    ural1057 Amount of degrees 
    http://acm.timus.ru/problem.aspx?space=1&num=1057 
    spoj1182 Sorted bit squence 
    https://www.spoj.pl/problems/SORTBIT/ 
    hdu3271 SNIBB 
    http://acm.hdu.edu.cn/showproblem.php?pid=3271 
     較難:
    spoj2319 Sequence 
    https://www.spoj.pl/problems/BIGSEQ/ 
    sgu390 Tickets 
    http://acm.sgu.ru/problem.php?contest=0&problem=390 
       以上分類的題目在我的部落格裡都可以找到詳細的解題報告和參考程式碼,由於比較麻煩就沒加連結,需要的可以用我的站內搜尋找到。
     本小結會不斷更新,轉載請註明出處。
     尤拉函式。
# pku 3696 The Luckiest number   
   //(10^n-1+..+10+1)=(10^n-1)/9, 尤拉函式,離散對數,注意溢位處理(相乘時變為aT+b )。
    http://acm.pku.edu.cn/JudgeOnline/problem?id=3696 
     樹狀陣列
# hdu 3333 
先求出每個位置後面和它一樣的最近的那個數的位置next[i] ,然後用樹狀陣列記錄不重複的前n 個數的和,接著對詢 問區間排序,從左到右做,記left 為在當前區間左邊的那些數,通過樹狀陣列,將left 到next[left]-1 之間的所有的數都減去 val[left] ,然後就可以直接像sum[i]-sum[j] 那樣方便的求出區間裡面沒有重複的數的和。
http://acm.hdu.edu.cn/showproblem.php?pid=3333 
# pku 3222 // 樹的dfs 和分治思想
解題報告見此:http://acm.pku.edu.cn/JudgeOnline /showmessage?message_id=129459