OI中的那些实用的小trick
在OI中,我们时常会用到一些小技巧,无论是代码方面还是数学方面抑或是卡常,都有很多不错的小技巧。
鄙人不才,往往没办法想出来,于是就有了这篇汇总帖~
如有疏漏,还请dalao指教!
-
结论:(gcd(F[n],F[m])=F[gcd(n,m)]),其中F为斐波那契数列
(quad)证明:
我们设(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)
(ecause quad F[n]=a,F[n+1]=b,F[m]=F[m-n-1]a+F[m-n]b)
( herefore quad F[m]=F[m-n-1]*F[n]+F[m-n]*F[n+1])
又(ecause quad gcd(F[n],F[m])=gcd(F[n],F[m-n-1])
而(F[n]|F[m-n-1])
( herefore quad gcd(F[n],F[m])=gcd(F[n],F[m-n])
引理:(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)
$ herefore 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]))
( herefore 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。
( herefore quad gcd(F[n],F[m])=F[gcd(n,m)])
-
分层图
(quad)分层图是一种常见的图论技巧。常用于图中存在某些限制的情况。具体而言,就是建图时将图按照不同的限制条件分层几层,其间有一些有向边连接,这些有向边一般代表着当前限制条件的状态的改变。这个技巧可以省掉很多特判或者别的的麻烦事,你只用在建好的图上做一般操作就可以了。
不间断更新~