數論初步
https://zybuluo.com/ysner/note/1109102
逆元求解
費馬小定理
假如a是一個整數,b是一個素數,\(gcd(a,p)=1\),則
\(a^{p-1}\equiv1(mod(p))\)
應用:
- 降次:\(a^bmod(p)=a^{(b)mod (p)}mod(p)\)
質數逆元:\(\frac{1}{a}mod (p)=a^(p-2)mod(p)\)
歐拉定理
若\(n,a\)為正整數,且\(n,a\)互質,則
\(a^{\phi(n)}\equiv 1(mod(n))\)
費馬小定理是歐拉定理的特殊情況,因為\(n\)為素數時,\(\phi(n)=n-1\)。
拓歐降次:- 當\(n>1\)時,\(a^b\%n=a^{b\%\phi(n)}\%n\)
- 當\(b\leq\phi(n)\)時,暴算
- 當\(b>\phi(n)\)時,\(a^b\%n=a^{b\%\phi(n)}\%n\)
拓歐解方程 求解\(a\equiv 1(mod(q)),x>0\)
則x解集為\(\phi(q)\)的約數與倍數。實踐
給定\(a,p(p>1),gcd(a,p)=1\),求\(a\)在模\(p\)意義下的逆元。
用Exgcd解方程\(ax\equiv 1(mod(p))\)
即\(ax+by=1\)int exgcd(int a,int b,int &d,int &x,int &y) { if(!b) x=1,y=0,d=a; else exgcd(b,a%b,d,y,x),y-=x*(a/b); } { re int a; exgcd(i,p,g,x,y); while(x<0) x+=p; printf("%d\n",x); }
- 利用歐拉定理\(a^{\phi(n)}\equiv1(mod(n))\)
有式\(a^{-1}\equiv a^{\phi(n)-1}(mod(n))\) - n為質數時,費馬小定理
\(a^{-1}\equiv a^{n-2}(mod(n))\) 線性求解
\(inv[i]=(p-p/i)*inv[p\%i]\)矩陣乘法
struct matrix{ int a[100][100]; matrix() { memset(a,0,sizeof(a)); } int * operator [](int x) { return a[x]; } matrix operator *(matrix b) { matrix c; for(int i=0;i<l;i++) for(int j=0;j<l;j++) for(int k=0;k<l;k++) c[i][k]=(c[i][k]+1ll*a[i][j]*b[j][k])%w; return c; } }S,T;
高斯消元
[專題總結][1]
組合數學
不可重組合數學(留坑)
- \(C^n_m\)表示在\(m\)中選\(n\)個的方案數。(把\(m\)個無區別物品放到\(n\)個有區別籃子的方案數)
\(C^m_n=\frac{n!}{m!(n-m)!}\)
\(C^m_n=C_{n-1}^{m-1}+C^m_{n-1}\)
\(C^k_n=C^{n-k}_n\)
\(C^{k+1}_n=C^k_n*\frac{n-k}{k+1}\)
\[(a+b)^n=\sum^n_{k=0}C_n^k a^{n-k} b^k\] - \(P^n_m\)表示在\(m\)中選\(n\)個的排列數。(把\(m\)個有區別物品放到\(n\)個有區別籃子的方案數)
\(P_m^n=C_m^n*n!\) \(S^n_m\)表示斯特林數。(把\(m\)個有區別物品放到\(n\)個無區別籃子,且籃子不空的方案數)
\(S_m^n=S_m^{n-1}*m+S_{m-1}^{n-1}\)
\(S_m^n=0(m>n)\)
可重組合數學
可重排列
有\(k\)個元素,其中第\(i\)個元素有\(n_i\)個,求全排列數。
\(P‘=\frac{(\sum_{i=1}^k n_i)!}{n_i!n_2!...n_k!}\)
即先全排列,然後給每個元素編號。
可重組合
有\(k\)個元素,每個元素可選無窮多個,一共選\(k\)個,求方案數。
\(C‘=C_{k-n+1}^{n-1}=C_{k-n+1}^k\)
假如第\(i\)個元素選\(x_i\)個,那麽原問題變為\(x_1+x_2+...+x_n=k\)。
令\(y_i=x_i+1\),那麽\(y_1+y_2+y_3+...+y_n=k+n\)
此時\(y>0\),即每個元素都要選。所以等於在\(k+n\)個元素(\(k+n-1\)個空位)間放\(n-1\)個隔板。
卡特蘭數
前幾個數:\(1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 1767263190\)
好像我只會用它打表找規律
公式:
\(C‘[n]=\frac{C_{2n}^n}{n+1}\)
\(C‘[n]=\sum_{i=1}^{n-1} C‘^iC‘^{n-i}\)
應用:
- 一個棧(無窮大)的進棧序列為1,2,3,…,n,有多少個不同的出棧序列?
- n個節點構成的二叉樹,共有多少種情形?
- 求一個凸多邊形區域劃分成三角形區域的方法數?
- 在圓上選擇2n個點,將這些點成對鏈接起來使得所得到的n條線段不相交,一共有多少種方法?
- n*n的方格地圖中,從一個角到另外一個角,不跨越對角線的路徑數.
n層的階梯切割為n個矩形的切法數。
數論分塊
求解\(\sum_{i+1}^n\lfloor\frac{n}{i}\rfloor\)
據觀察,\(\lfloor\frac{n}{i}\rfloor\)的取值只有\(\sqrt{n}\)個。
定理:若有一個值\(i\),那麽數論分塊中其同值上界為\(ceil=\lfloor\frac{n}{\lfloor\frac{n}{i}\rfloor}\rfloor\)。
即在\([i,ceil]\)這一段區間內,\(\lfloor\frac{n}{i}\rfloor\)的取值是一樣的,於是可計算整塊貢獻。int l = 1 , r , ans = 0; while(l<=n){ r = n/(n/l); ans += (r-l+1)*(n/i); l = r + 1; }
數論初步