1.設A與C是互質的兩個數,求B,使得A*B=1(mod C)。算法
解:因爲gcd(A,C)=1,所以利用擴展歐幾里德函數能夠找到a*A+c*C=1,即a*A=1(mod C)。咱們取B=a便可。數組
2.求$\sum_{i=1}^n{\frac{1}{i}}$的上下界。數據結構
解:$\ln \left( n+1 \right) = \int_1^{n+1}{\frac{1}{x}dx}\le \sum_{i=1}^n{\frac{1}{i}}\le 1+\int_1^n{\frac{1}{x}dx}=1+\ln \left( n \right) $。函數
3.求形如$\sum_{i=1}^n{i^{\alpha}}$的上下界,其中α>=0。對象
解:$1+\frac{1}{\alpha +1}\left( n^{\alpha +1}-1 \right) =1+\int_1^n{x^{\alpha}dx}\le \sum_{i=1}^n{i^{\alpha}}\le \int_1^{n+1}{x^{\alpha}dx}=\frac{1}{\alpha +1}\left( \left( n+1 \right) ^{\alpha +1}-1 \right) $。排序
4.對於全部i<=L,求全部i的素因子。內存
解:利用歐拉篩,每次都只會處理一次合數,處理的時候將所用到的素數填入。時間複雜度爲O(L)。字符串
5.因子數目最多的數。數學
解:<=1e1, 6, 4hash
<=1e2,60,12
<=1e3,840,32
<=1e4,7560,64
<=1e5,83160,128
<=1e6,720720,240
<=1e7,8648640,448
<=1e8,73513440,768
6.對多項式進行卷積 。
解:快速傅立葉變換。
7.求a/b向上取整
解:(a+b-1)/b。
8.對浮點數f進行四捨五入
解:(int)(f + 0.5)
9.取整數i的二進制最後一位。
解:i&-i。
1.要求大批量查詢區間最大值最小值。
解:1.若是區間不會被修改,則使用ST算法在長度爲n的區間上以時空複雜度O(nlog2n)作預處理,並以O(1)時間複雜度作查詢。
2.若是區間會被修改,則使用線段樹進行處理。
2.在一株樹上統計路徑信息。
解:使用LCT,全部操做時間複雜度均爲O(log2n)。
3.數據範圍較大,但實際數據較少。
解:離散處理。
4.要求屢次處理樹上差分,每一個結點對應一組值。
解:樹上每一個結點對應一個持久化線段樹,而且子結點的持久化線段樹在父結點的持久化線段樹上建立。
5.給定n大小不變區間,區間值最大值爲M,m次查詢區間第k小。
解:將區間視爲一株樹,下標i對應i+1的父結點,問題至關於在樹上作差分。查詢區間[l,r]上第k小,等價於查詢持久化線段樹r與持久化線段樹l-1的差分對應的線段樹上第k小元素。時間複雜度爲O((n+m)log2(M))。
6.給定一株含n個結點的樹,m次查詢lca。
解:1.先利用dfs將樹壓成區間,以後利用st處理區間最小值和最大值。時間複雜度爲O(2nlog2(n)+m)。
2.若是容許離線處理,則利用tarjan算法能夠在O(n+m)時間複雜度內求出。
7.給定長度爲n的區間A,m次詢問求子區間值的加總。
解:1.若是區間不會被修改,那麼能夠用差分,建立新的數組s,其中s[i]=A[0]+...+A[i],則A[i]+...+A[j]=s[j]-s[i-1]。時間複雜度爲O(n+m)。
2.若是區間會被修改,可使用線段樹。時間複雜度爲O(n+mlog2n)。
8.給定長度爲n的數組,給定m個請求,每一個請求要求查詢一段區間中不一樣的值的數目。
解:莫隊算法,暴力得AC,時間複雜度爲O(n+n√m)。
9.給定一株樹,每一個結點對應一個值。求某個結點做爲根的子樹下不一樣的值的數目。
解:樹上莫隊,將樹經過dfs壓成數組,子樹表明的是一段連續區間,以後莫隊。
1.dp[i+1]=f(dp[i]),其中f是線性函數,求dp[k],k很大。
解:將f表示爲矩陣,以後對矩陣作快速冪乘求f^k,最後應用於dp[0],則dp[k]=f^k(dp[0])。時間複雜度爲O(n^3*log2(k)),n爲矩陣大小(dp[i]的維度)。
1.給定長度爲n的字符串,m次判斷兩個子串是否相同。
解:在字符串上進行hash處理,以後以O(1)實際複雜度取子串哈希值並進行比較。實際複雜度爲O(n+m)。注意要當心生日悖論,若是哈希範圍爲k,則只須要sqrt(k)個不一樣子串就有1/2以上的機率使得存在兩個子串擁有相同哈希值,這時候能夠屢次進行哈希,從而提升k的範圍。
2.判斷長度爲n的字符串中最長迴文。
解:1.哈希:利用哈希能夠在O(1)時間複雜度內判斷某個子串是否爲迴文,若是以i爲左邊界的最長迴文爲s[i,j],則以i+1爲左邊界的最長迴文至少爲s[i-1,j-1],所以判斷總次數爲2*n。
2.manacher算法,時空複雜度爲O(n)。
3.迴文樹,時空複雜度爲O(n*α),α爲字符集大小。
3.判斷長度爲n與m的字符串a與b的最長相同子串。
解:後綴自動機。
1.平面上n個矩形,求被這些矩形覆蓋的面積。
解:先對矩形按照矩形底部y座標進行從小到大排序。以後用掃描線算法從左到右掃描矩形左右邊界。總的時間複雜度爲O(n^2)。
2.給定三個非共線點,計算三角形面積。
解:設三點爲A,B,C,則求向量AB與AC以後計算|ABxAC|/2即爲三角形面積,其中x表示外積。
3.給定向量a,b,判斷b與a的關係。
解:計算axb,若爲正數,則表示b在a的逆時針方向,若爲負數,則b在a的順時針方向,不然a與b共線。
4.給定三角形ABC,和一個點p,判斷點p是否處於ABC內部(包含邊上)。
解:計算ABp,ACp,BCp的面積之和,若是等同於ABC則p在ABC內部,不然在ABC外部。
5.計算凸多邊形的面積。
解:凸多邊形能夠表示爲多個三角形的合併。
6.判斷點p與向量AB的關係。
解:至關於判斷向量Ap與向量AB的關係。
7.判斷點p在線段AB上。
解:要保證p於向量AB共線,以後還要保證min(A.x,B.x)<=p.x<=max(A.x,B.x),且min(A.y,B.y)<=p.y<=max(A.y,B.y)。
8.三角形的心臟。
解:1.外心(外接圓圓心),三條中垂線交點。
2.心裏(內接圓圓心),三條角平分線交點。
3.重心,三條中線交點,三條中線將三角形切分爲6個面積相同的三角形,太重心任意一條劃線,將三角形切分爲面積相同的兩部分。
9.計算兩條直線交點,直線分別由兩個不一樣頂點P1,P2與P3,P4給出。
解:利用代數幾何的思想。直線P1P2上的任意點能夠由f(a)=(1-a)P1+ap2給出,同理P3,P4上的點能夠由g(b)=(1-b)P3+bP4給出,當0<=a,b<=1時,f(a)與g(a)分別落在P1P2與P3P4所表明的線段上。
而P1P2與P3P4的交點則由等式f(a)=g(b)給定。
設Pi=(xi,yi),則f(a)=g(b)能夠展開爲二元一次方程組:
$$
\begin{cases}
\left( x_2-x_1 \right) a+\left( x_3-x_4 \right) b=x_3-x_1\\
\left( y_2-y_1 \right) a+\left( y_3-y_4 \right) b=y_3-y_1\\
\end{cases}
\\
\Rightarrow \left[ \begin{matrix}
x_2-x_1& x_3-x_4\\
y_2-y_1& y_3-y_4\\
\end{matrix} \right] \left[ \begin{array}{c}
a\\
b\\
\end{array} \right] =\left[ \begin{array}{c}
x_3-x_1\\
y_3-y_1\\
\end{array} \right]
\\
\Rightarrow \left[ \begin{array}{c}
a\\
b\\
\end{array} \right] =\left[ \begin{matrix}
x_2-x_1& x_3-x_4\\
y_2-y_1& y_3-y_4\\
\end{matrix} \right] ^{-1}\left[ \begin{array}{c}
x_3-x_1\\
y_3-y_1\\
\end{array} \right]
$$
對於計算逆矩陣,能夠利用:
$$
A^{-1}=\left( \det A \right) ^{-1}A^V
$$
其中A^V表示矩陣A的伴隨矩陣,對於二元矩陣有:
$$
\left[ \begin{matrix}
a& b\\
c& d\\
\end{matrix} \right] ^V=\left[ \begin{matrix}
d& -b\\
-c& a\\
\end{matrix} \right]
$$
若detA=0,則表示式子有多個解或無解,這時候兩條直線一定平行。
解出a與b後,能夠利用f(a)或g(b)得到交點。
10.判斷兩條線段是否相交。
解:先利用問題9的解法計算兩條線段的交點,獲得a與b後驗證0<=a,b<=1便可。或者算出交點後判斷交點是否在兩條線段上便可。
1.n個槽,將m個對象存入到這n個槽中。
解:利用動態表或者鏈表均能以O(n+m)的時空複雜度內完成。
2.n個空間,使用前須要初始化,如何屢次複用。
解:額外分配n個空間,記錄每一個對於空間上次初始化時的版本,以後訪問該空間以前,先比較版本,若是版本不一樣,則先初始化後更新版本。訪問的時間複雜度爲O(1),可是常數較大。