1. 程式人生 > >noip考前抱佛腳 數論小總結

noip考前抱佛腳 數論小總結

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\)
    的形式,把\(y_0\)\(y_i\)解出來。
  • 此時\[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\)

    要從\(0\)開始到\(m\),但是查表的時候\(i\)要從\(1\)開始到\(m\)

    同餘最短路

  • 用一些數去拼湊出給定的數。
  • 以最小值建立剩餘系,令\(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
  • 注意要先判斷無解再判斷解不唯一。