在OI中,咱們時常會用到一些小技巧,不管是代碼方面仍是數學方面抑或是卡常,都有不少不錯的小技巧。spa
鄙人不才,每每沒辦法想出來,因而就有了這篇彙總帖~cdn
若有疏漏,還請dalao指教!遞歸
咱們設\(n<m\),\(F[n]=a\)和\(F[n+1]=b\)。數學
則\(F[n+2]=a+b,F[n+3]=a+2b,…F[m]=F[m-n-1]a+F[m-n]b\)class
\(\because \quad F[n]=a,F[n+1]=b,F[m]=F[m-n-1]a+F[m-n]b\)技巧
\(\therefore \quad F[m]=F[m-n-1]*F[n]+F[m-n]*F[n+1]\)gc
又\(\because \quad gcd(F[n],F[m])=gcd(F[n],F[m-n-1]\)trick
而\(F[n]|F[m-n-1]\)math
\(\therefore \quad gcd(F[n],F[m])=gcd(F[n],F[m-n]\)gcd
引理:\(gcd(F[n],F[n+1])=1\)
證:由歐幾里德定理知
\(gcd(F[n],F[n+1])=gcd(F[n],F[n+1]-F[n])=gcd(F[n],F[n-1])\)
\(=gcd(F[n-2],F[n-1])\)
\(…………\)
\(=gcd(F[1],F[2])=1\)
$ \therefore \quad gcd(F[n],F[n+1])=1$
由引理知:
\(F[n],F[n+1]\)互質
而\(gcd(F[n],F[m])=gcd(F[n],F[m-n]*F[n+1])\)
\(\therefore \quad gcd(F[n],F[m])=gcd(F[n],F[m-n])\)
即\(gcd(F[n],F[m])=gcd(F[n],F[m\;mod\;n])\)
繼續遞歸,將\(m1=m\;mod\;n\),則\(gcd(F[n],F[m])=gcd(F[n\;mod\;m1],F[m1])\)
\(……\)
不難發現,整個遞歸過程其實就是在求解\(gcd(n,m)\)
最後遞歸到出現\(F[0]\)時,此時的\(F[n]\)就是所求gcd。
\(\therefore \quad gcd(F[n],F[m])=F[gcd(n,m)]\)
分層圖
\(\quad\)分層圖是一種常見的圖論技巧。經常使用於圖中存在某些限制的狀況。具體而言,就是建圖時將圖按照不一樣的限制條件分層幾層,其間有一些有向邊鏈接,這些有向邊通常表明着當前限制條件的狀態的改變。這個技巧能夠省掉不少特判或者別的的麻煩事,你只用在建好的圖上作通常操做就能夠了。
不間斷更新~