1. 程式人生 > >數論初步

數論初步

strong 貢獻 矩形 pla del https 出棧 http 二叉樹

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;
    }

數論初步