noip考前抱佛腳 數論小總結
阿新 • • 發佈:2018-11-07
exCRT
- 求解韓信點兵問題,常見的就是合併不同\(mod\)。
- 先mo一發高神的板子
for(R i=2;i<=n;++i){
ll Y1,Yi,lcm=Lcm(p[i],p[1]);
exgcd(p[1],p[i],a[i]-a[1],Y1,Yi);
add(a[1],mul(p[1],Y1,lcm),lcm),p[1]=lcm;
}
- 思想是合併方程組,現在假設我們要求解的是:
\[x-p_0*y_0=a_0\]\[x-p_i*y_i=a_i\] - \(x\)是實際的值,顯然有:
\[p_0*y_0-p_i*y_i=a_i-a_0\] - 是\(exgcd\)
- 此時\[p_0*y_0 = a_i-a_0\ \ \ mod \ p_i\]
- 所以讓\(y_0\)對\(p_i\)取模,回代到\[x=p_0*y_0+a_0\]
- 此時\(x\)是在\(mod\ p_i*p_0\)意義下,取模後便是新的\(a_0\)了。
最後更新\(p_0\)
- excrt就是把\(p_0*=p_i\)改成\(p_0=lcm(p_0,p_i)\)罷了。
BSGS
拔山蓋世?求
\[y^x≡z\ mod\ p\]
設\(x=i*m-j\),其中\(m=\sqrt p+1\)則
\[y^j*z≡y^{i*m}\]
- 列舉\(j\),把對應的\(y^j*z\)放在\(hash\)表裡。或者也可以用\(map\)
- 注意這個時候的\(j\)要取最大值,從小往大列舉直接附值即可。
- 列舉\(i\),查對應的\(y^{i*m}\),如果有值,答案就是\(i*m-j\)了。
- 複雜度\(O(\sqrt p)\)
- 注意前提條件\(gcd(y, p) = 1\)
如果\(y\ mod\ p==0\),則無解。
- \(upd\ on\ 11.7\)
- 首先有個模板題P4454 [CQOI2018]破解D-H協議
注意到
\[y^j*z≡y^{i*m}\]
這個東西中\(i*m-j\ge 0\)恆成立,所以在預處理時要\(j\)
同餘最短路
- 用一些數去拼湊出給定的數。
- 以最小值建立剩餘系,令\(f_i\)表示在拼湊出長度\(mod\)最小值為\(i\)的最小花費。
- 顯然每一個\(f_i\)都是這個剩餘系中的最小值,且相互獨立。
- 連邊後做最短路即可。
- 不能拼湊出的最大值即位\(max(f_i-w_0)\),\(w_0\)是剩餘系模數。
- [x] HDU 6071 Lazy Running
- 給出四個點1,2,3,4,1和2,2和3,3和4,4和1之間有路相連,現在從2點出發,最後回到2點,要求路徑大於等於\(K\),問路徑長度最短是多少,\(K\leq 10^{18},d\leq 3*10^4\)。
- 同餘最短路套路了,取一條與\(2\)相連的權值最小的邊\(w\)。
- 若存在一條從起點到終點的長度為k的路徑,那麼必然存在一條長度為\(k+2w\)的路徑。
- 即只要一開始在那條邊上往返走就好了。
- 設\(d_{i,j}\)表示從起點到\(i\),路徑長度模\(2w\)為\(j\)時,路徑長度的最小值。
然後\(dij\)預處理\(d\),最後列舉所有剩餘系,如果大於等於\(K\)就恰好更新答案,否則補上剩下除以\(2*w\)向上取整數。
exgcd
- 求解\(a*x+b*y=c\)的最小特解。
- 注意在某些題目中要判斷是否有解(裴蜀定理)。
設\(f=gcd(a,b,c)\),有一些題目中\(x=0\)要還原成\(b\),但是此時應該要還原成\(\frac {b}{gcd}\),這樣才能保證最小正整解。
盧卡斯定理
- 處理計算組合時取模數特別小的時候,往往小於\(n,m\)。
對於質數而言,
\[C_n^m=C_{n\ mod\ p}^{m\ mod\ p }*C_{n/p}^{m/p }\]裴蜀定理
\(a*x+b*y=c\)成立的充要條件是\(gcd(a,b)|c\).
組合計數
這不是計數裡面的東西嗎咕咕。線性篩逆元
- 假設現在要求\(inv_i\),那麼
- 有\(x*i+j=p\),此時\(j=p\ mod\ i\),\(x=\frac {p}{i}\)
- 在\(p\)剩餘系下,那麼\(inv_i=-1*x*inv_j\)
所以\(inv(i)=-inv(p\ mod\ i)*(p/i)\)
三分法
咕咕。
高斯消元
- 我採用的是高斯約旦消元法。
- 先找到係數最大的點提到當前行,然後消為\(1\),在把其他所有行的這一列消為\(0\)。
- 這樣就省去了迴帶的過程。
- 無解情況:所有係數全為0但是值不為0
- 不唯一解情況:所有係數全為0值也為0
注意要先判斷無解再判斷解不唯一。