7.21算法
今天DTZ大爺教了我一個算歐拉函數的好方法......是質因數複雜度的數組
這讓我想到,這些小技巧小idea,不少時候,可能就是考場上最致命、最一擊必殺的「大招」數據結構
所以開個坑記錄一下,定有好處ide
歐拉函數的意義是比一個數小的數中有多少個和它互質的,不要考場上想到了這句話想不到歐拉函數函數
而後是求歐拉函數的一個方法優化
設一個數$x=\prod_{i=1}^{k}p_i^{a_i}$,那麼:idea
在作FFT,NTT之類的題目時,會用到大量的模數指針
這時,如下三種方法:code
#define MOD 1000000007 const ll MOD=1000000007 ll MOD=1000000007
第一種快於第二種快於第三種排序
並且都是快不少的那種快法
所以最好使用第一種
NTT中,作多項式求逆和多項式開根的時候,每次迭代只須要取前len項出來,而後len到(len<<1)的項必定要清零
這樣會快不少
同時注意原式中能約的就約掉,也能提高常數
其中$d=gcd(i,j)$
莫比烏斯函數的性質利用
這玩意有啥用呢?好比說我要求$\sum_{i=1}^n\sum_{j=1}^m\varphi(ij)$
那麼能夠這麼化式子
原式
設$T=de$
那麼原式
這樣題目就變簡單了
今天又作到關於樹、堆之類的東西的形態構建題目了
對於問你一棵二叉樹/多叉樹有幾種構建方式的,能夠考慮從每一個節點的子樹的角度去DP、設方程,而後用多項式優化,或者組合數之類的
設$F_i$表示斐波那契數列的第$i$項,那麼:
$gcd(F_i,F_j)=F_{gcd(i,j)}$
同時注意線性篩中間要break的是$i$ $mod$ $ pri[j] ==0$,不要漏掉了$==0$!!!
積性函數的斷定:
兩個積性函數的狄利克雷卷積仍然是積性函數
二項式反演:
$F(n)=\sum_{i=0}^n C_n^i G(i)$
$G(n)=\sum_{i=0}^n (-1)^{n-i} C_n^i F(i)$
$LCT$的$splay$以前寫的$push$中有的時候沒法使用遞歸寫法,此時要注意彈棧過程當中的$top--$
while(sta[top--]) pushdown(sta[top]); while(sta[top]) pushdown(sta[top--]);
下面的是對的,上面是錯的
$SAM$的經常使用操做是把$fail$指針(也就是$fa$)反過來,而後在樹上$dp$(這個好像很sb的樣子我爲何要寫上來qwq)(我太菜了)
由$Polya$定理能夠計算把一個長度爲$n$的環塗上$m$種顏色的不一樣方案:
$L=\frac{1}{n}\sum_{i=1}^{n} m^{gcd(i,n)}$
很久沒更新了......
長鏈剖分+單調隊列合併,能夠把求樹上長度爲$[L,R]$區間的路徑的相關問題作到$O(n)$
遇到長得像二次方程根的那種遞推、通項之類的東西,能夠考慮反推特徵根方程
兩棵樹經過一條邊連在一塊兒的時候,新樹的直徑端點是原來兩棵樹的四個端點中的兩個
遇到和深度相關的、有繼承關係的問題,能夠考慮同一條鏈共用dp值的方式
SA遇處處理原序列順序的相關問題時,能夠考慮加入主席樹,按照sa順序加入,元素是原位置
一個多月沒更新......
樹形dp在n小的時候,能夠考慮以每一個點爲根進行dp,這樣能夠加入一些限制,可能有奇效
樹狀數組能夠維護區間加、區間查詢和!(詳見HNOI2017影魔)
樹的拓撲序個數爲$\frac{n}{\prod size(u)}$
詐屍式更新
考慮一個函數是否爲多項式時,能夠差分它
若是通過了$k$次差分後獲得0,那麼它是一個$k-1$次多項式
這個能夠和拉格朗日插值一塊兒用
泰勒展開.....
看到和式有着$\sum_i delta\ast\frac{x^i}{i!}$的形式的時候,要考慮到$e^x$的泰勒展開式:
$e^x=\sum_{i=0}^{\infty} \frac{x^i}{i!}$
更新一個很是規思路list
純序列問題:cdq分治,總體二分,樹套樹,奇怪的線段樹
序列問題且只和區間邊界有關:先考慮dp,不行多是線段樹(usaco式合併)
須要維護區間對一個值取max/min:吉老師線段樹(Segment Tree Beats!)
計算幾何奇怪形狀:分步枚舉,考慮哪些元素的肯定會對其餘人限制最大
關於模意義下二次方程:二次剩餘
序列上的點是連續的狀況(也就是原本要用微積分的):注意此時序列上任選兩個點重合機率爲0
待續(可能後面會考慮把這個東西改爲一個trick列表.....?)
期中考試去了......有一段時間沒作題
還好考了個年25,還看得過去吧(雖然本身不是特別滿意)
= =
遇到排序相關、交換相關的題目,能夠考慮按照元素大小變成零一序列,可能有奇效
四色定理相似問題能夠先生成樹,再看剩下的邊是否是二分圖,最後兩個分別染色而後合併
除此以外就只能爆搜了
注意這種條件下不知足四色定理的圖必定有奇環:二分圖斷定原理
考慮dp的時候,要注意一些全局的限制:可能會遇到dp的兩個維度有乘起來不超過一個值的狀況
此時可能能夠導出調和級數複雜度!
走路+選擇路上元素問題的dp,能夠反過來考慮,不是dp已經選了那些,而是dp剩下的都沒選的時候(也就是走到哪裏爲止)能夠配合上述調和級數作
這種dp要注意的是,關於走路中的一些「體力限制」,會出現你沒走到哪裏可能會花更少的「全局體力」,此時注意在dp中考慮這一因素的影響
調和級數dp在滾動數組的時候採用一個一個重置爲in的方式比較可靠,否則極可能memset複雜度掛
若是想對於一個n點圖的凸包求出去掉凸包上每個點後,在新的n-1點圖中獲得的新凸包的點集的並集,能夠採用這樣的方法:
設原凸包點集依次爲$a[1...m]$,那麼對於奇數下標的標上顏色一,偶數顏色二,若是$m$是奇數那最後一個標顏色3、第一個去掉顏色
而後作三次求凸包,每次去掉一種顏色的點(沒有顏色的就無論),三個凸包上全部的點集合就是所求的並集
這個方法簡而言之就是每隔一個點去掉一個,能夠把這一算法複雜度從$O(n^2\log n)$降到$O(n\log n)$
排列問題雙巨頭:括號序列!線段樹!
線段樹裏面不只能夠套凸包優化決策,竟然還能夠套半平面交......
遇到區間交集題目或者什麼別的東西,有「選擇的長度和貢獻線性相關」的,能夠考慮一下從一次函數的觀點看問題,可能能變成幾何題
遇到不會dp,若是n^3或者kn^2能接受的話,想想區間dp的方法,並嘗試一波四邊形優化
四邊形優化不必定要證實,能夠打個表試一試(固然前提是要先確保原來的區間dp是對的,要先對拍再打表)
線段樹求最小值和最小值個數能夠解決區間覆蓋型問題
多模式串匹配算法要想到AC自動機!能夠在上面跑dp
注意AC自動機要合併fail樹上全部祖先節點的信息
平均數求和問題若是有二分性則能夠01分數規劃!
平均的那個除N挪到右邊,再挪回來,能夠去掉siz在dp中的限制
cf559div1打的奇差無比......找規律還能fst,策略大失敗,懷疑本身的智商沒資格搞OI了
遇到
有一個排列,給出這個排列每一個位置的一個和後面位置以及大小有關的信息(好比在它後面第一個比他大的),求這個排列
的這種題,能夠考慮排列的合法性。不少時候會發現會出現例如$i<j<p[i]$則$a[i]>a[j]$必須知足的狀況(這個基於區間大小限制)
這樣就能夠創建限制拓撲圖,能夠拓撲排序賦值
對於一些有不少位置,每一個位置有不少取值,而後問你全部這些取值的前$k$大的問題,可使用優先隊列完成:
用pair記錄取值和取值位置,而後每次取出優先隊列裏面取值最大的那個,而後在對應的位置查詢第二大(第三大、第四大……)的取值,再插入
適用於能夠查詢區間$k$大的數據結構,例如主席樹、可持久化trie等
sam有一些新get的技巧,去看我寫的sam那篇博客吧