一些技巧 && 常數優化 && 出現の錯誤 [絕贊更新中!]

開坑緣由

7.21算法

今天DTZ大爺教了我一個算歐拉函數的好方法......是質因數複雜度的數組

這讓我想到,這些小技巧小idea,不少時候,可能就是考場上最致命、最一擊必殺的「大招」數據結構

所以開個坑記錄一下,定有好處ide

7.21

歐拉函數的意義是比一個數小的數中有多少個和它互質的,不要考場上想到了這句話想不到歐拉函數函數

而後是求歐拉函數的一個方法優化

設一個數$x=\prod_{i=1}^{k}p_i^{a_i}$,那麼:idea

$\varphi(x)=\prod_{i=1}^{k}(p_i-1)p_i^{a_i-1}=x\prod_{i=1}^{k}\frac{p_i-1}{p_i}$

7.24

在作FFT,NTT之類的題目時,會用到大量的模數指針

這時,如下三種方法:code

#define MOD 1000000007
const ll MOD=1000000007
ll MOD=1000000007

第一種快於第二種快於第三種排序

並且都是快不少的那種快法

所以最好使用第一種

7.25

NTT中,作多項式求逆和多項式開根的時候,每次迭代只須要取前len項出來,而後len到(len<<1)的項必定要清零

這樣會快不少

同時注意原式中能約的就約掉,也能提高常數

7.29

$\varphi(i\ast j)=\frac{\varphi(i)\varphi(j)d}{\varphi(d)}$

其中$d=gcd(i,j)$

莫比烏斯函數的性質利用

$\mu\ast I = \epsilon$

$[gcd(i,j)==1]=\sum_{e|i,e|j}\mu(e)$

這玩意有啥用呢?好比說我要求$\sum_{i=1}^n\sum_{j=1}^m\varphi(ij)$

那麼能夠這麼化式子

原式

$=\sum_{d=1}^n \frac{d}{\varphi(d)} \sum_{i=1}^n \sum_{j=1}^m \varphi(i)\varphi(j) [gcd(i,j)==d]$

$=\sum_{d=1}^n \frac{d}{\varphi(d)} \sum_{i=1}^{\frac{n}{d}} \sum_{j=1}^{\frac{m}{d}} \varphi(id)\varphi(jd) [gcd(i,j)==1]$

$=\sum_{d=1}^n \frac{d}{\varphi(d)} \sum_{i=1}^{\frac{n}{d}} \sum_{j=1}^{\frac{m}{d}} \varphi(id)\varphi(jd) \sum_{e|i,e|j}\mu(e)$

$=\sum_{e=1}^n\mu(e)\sum_{d=1}^\frac ne\frac d{\varphi(d)}\sum_{i=1}^\frac n{de}\sum_{j=1}^\frac m{de}\varphi(ide)\varphi(jde)$

設$T=de$

那麼原式

$=\sum_{T=1}^n \sum_{d|T} \mu(\frac{T}{d})\frac{d}{\varphi(d)} \sum_{i=1}^{\frac{n}{T}} \varphi(iT) \sum_{j=1}^{\frac{m}{T}} \varphi(jT)$

這樣題目就變簡單了

7.30

今天又作到關於樹、堆之類的東西的形態構建題目了

對於問你一棵二叉樹/多叉樹有幾種構建方式的,能夠考慮從每一個節點的子樹的角度去DP、設方程,而後用多項式優化,或者組合數之類的

8.2

設$F_i$表示斐波那契數列的第$i$項,那麼:

$gcd(F_i,F_j)=F_{gcd(i,j)}$

同時注意線性篩中間要break的是$i$ $mod$ $ pri[j] ==0$,不要漏掉了$==0$!!!

積性函數的斷定:

兩個積性函數的狄利克雷卷積仍然是積性函數

8.4

二項式反演:

$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)$

8.12

$LCT$的$splay$以前寫的$push$中有的時候沒法使用遞歸寫法,此時要注意彈棧過程當中的$top--$

while(sta[top--]) pushdown(sta[top]);
while(sta[top]) pushdown(sta[top--]);

下面的是對的,上面是錯的

8.13

$SAM$的經常使用操做是把$fail$指針(也就是$fa$)反過來,而後在樹上$dp$(這個好像很sb的樣子我爲何要寫上來qwq)(我太菜了)

由$Polya$定理能夠計算把一個長度爲$n$的環塗上$m$種顏色的不一樣方案:

$L=\frac{1}{n}\sum_{i=1}^{n} m^{gcd(i,n)}$

9.10

很久沒更新了......

長鏈剖分+單調隊列合併,能夠把求樹上長度爲$[L,R]$區間的路徑的相關問題作到$O(n)$

遇到長得像二次方程根的那種遞推、通項之類的東西,能夠考慮反推特徵根方程

兩棵樹經過一條邊連在一塊兒的時候,新樹的直徑端點是原來兩棵樹的四個端點中的兩個

遇到和深度相關的、有繼承關係的問題,能夠考慮同一條鏈共用dp值的方式

SA遇處處理原序列順序的相關問題時,能夠考慮加入主席樹,按照sa順序加入,元素是原位置

10.25

一個多月沒更新......

樹形dp在n小的時候,能夠考慮以每一個點爲根進行dp,這樣能夠加入一些限制,可能有奇效

樹狀數組能夠維護區間加、區間查詢和!(詳見HNOI2017影魔)

樹的拓撲序個數爲$\frac{n}{\prod size(u)}$

1.5

詐屍式更新

考慮一個函數是否爲多項式時,能夠差分它

若是通過了$k$次差分後獲得0,那麼它是一個$k-1$次多項式

這個能夠和拉格朗日插值一塊兒用

4.12

泰勒展開.....

看到和式有着$\sum_i delta\ast\frac{x^i}{i!}$的形式的時候,要考慮到$e^x$的泰勒展開式:

$e^x=\sum_{i=0}^{\infty} \frac{x^i}{i!}$

4.14

更新一個很是規思路list

純序列問題:cdq分治,總體二分,樹套樹,奇怪的線段樹

序列問題且只和區間邊界有關:先考慮dp,不行多是線段樹(usaco式合併)

須要維護區間對一個值取max/min:吉老師線段樹(Segment Tree Beats!)

計算幾何奇怪形狀:分步枚舉,考慮哪些元素的肯定會對其餘人限制最大

關於模意義下二次方程:二次剩餘

序列上的點是連續的狀況(也就是原本要用微積分的):注意此時序列上任選兩個點重合機率爲0

待續(可能後面會考慮把這個東西改爲一個trick列表.....?)

5.3

期中考試去了......有一段時間沒作題

還好考了個年25,還看得過去吧(雖然本身不是特別滿意)

= =

遇到排序相關、交換相關的題目,能夠考慮按照元素大小變成零一序列,可能有奇效

5.4

四色定理相似問題能夠先生成樹,再看剩下的邊是否是二分圖,最後兩個分別染色而後合併

除此以外就只能爆搜了

注意這種條件下不知足四色定理的圖必定有奇環:二分圖斷定原理

考慮dp的時候,要注意一些全局的限制:可能會遇到dp的兩個維度有乘起來不超過一個值的狀況

此時可能能夠導出調和級數複雜度!

走路+選擇路上元素問題的dp,能夠反過來考慮,不是dp已經選了那些,而是dp剩下的都沒選的時候(也就是走到哪裏爲止)能夠配合上述調和級數作

這種dp要注意的是,關於走路中的一些「體力限制」,會出現你沒走到哪裏可能會花更少的「全局體力」,此時注意在dp中考慮這一因素的影響

調和級數dp在滾動數組的時候採用一個一個重置爲in的方式比較可靠,否則極可能memset複雜度掛

5.7

若是想對於一個n點圖的凸包求出去掉凸包上每個點後,在新的n-1點圖中獲得的新凸包的點集的並集,能夠採用這樣的方法:

設原凸包點集依次爲$a[1...m]$,那麼對於奇數下標的標上顏色一,偶數顏色二,若是$m$是奇數那最後一個標顏色3、第一個去掉顏色

而後作三次求凸包,每次去掉一種顏色的點(沒有顏色的就無論),三個凸包上全部的點集合就是所求的並集

這個方法簡而言之就是每隔一個點去掉一個,能夠把這一算法複雜度從$O(n^2\log n)$降到$O(n\log n)$

排列問題雙巨頭:括號序列!線段樹!

5.8

線段樹裏面不只能夠套凸包優化決策,竟然還能夠套半平面交......

遇到區間交集題目或者什麼別的東西,有「選擇的長度和貢獻線性相關」的,能夠考慮一下從一次函數的觀點看問題,可能能變成幾何題

遇到不會dp,若是n^3或者kn^2能接受的話,想想區間dp的方法,並嘗試一波四邊形優化

四邊形優化不必定要證實,能夠打個表試一試(固然前提是要先確保原來的區間dp是對的,要先對拍再打表)

5.9

線段樹求最小值和最小值個數能夠解決區間覆蓋型問題

5.12

多模式串匹配算法要想到AC自動機!能夠在上面跑dp

注意AC自動機要合併fail樹上全部祖先節點的信息

平均數求和問題若是有二分性則能夠01分數規劃!

平均的那個除N挪到右邊,再挪回來,能夠去掉siz在dp中的限制

5.13

cf559div1打的奇差無比......找規律還能fst,策略大失敗,懷疑本身的智商沒資格搞OI了

遇到

有一個排列,給出這個排列每一個位置的一個和後面位置以及大小有關的信息(好比在它後面第一個比他大的),求這個排列

的這種題,能夠考慮排列的合法性。不少時候會發現會出現例如$i<j<p[i]$則$a[i]>a[j]$必須知足的狀況(這個基於區間大小限制)

這樣就能夠創建限制拓撲圖,能夠拓撲排序賦值

5.16

對於一些有不少位置,每一個位置有不少取值,而後問你全部這些取值的前$k$大的問題,可使用優先隊列完成:

用pair記錄取值和取值位置,而後每次取出優先隊列裏面取值最大的那個,而後在對應的位置查詢第二大(第三大、第四大……)的取值,再插入

適用於能夠查詢區間$k$大的數據結構,例如主席樹、可持久化trie等

sam有一些新get的技巧,去看我寫的sam那篇博客吧

相關文章
相關標籤/搜索