数学

组合数学

  • \(A_n^m=\frac{n!}{(n-m)!}\) 表示在 \(n\) 个不同的元素中选出 \(m\) 个元素的排列数
  • \(C_n^m=\frac{A_n^m}{m!}=\frac{n!}{m!(n-m)!}\) 表示在 \(n\) 个不同的元素中选出 \(m\) 个元素的方案数
  • 二项式定理:\((a+b)^n=\sum C_n^i a^i b^{n-i}\)\(2^n=\sum C_n^i\)
  • 扩展:
    \((\sum_{i=1}^t x_i)^n = \sum_{ \sum n_i=n(0\le n_i)} \frac{n!}{n_1!n_2!\cdots n_t!} x_1^{n_1}x_2^{n_2}\cdots x_t^{n_t}\)

组合数练习

  • 问题 \(1\):有 \(n\) 个完全相同的苹果,分到 \(m\) 个盘子且没有空盘子的方案数。
    • 问题相当于在一段苹果序列中插入 \(m-1\) 个板子,使得苹果被分成 \(m\) 份,每一份苹果对应一个盘子。
    • \(Ans=C_{n-1}^{m-1}\)
  • 问题 \(2\):存在空盘子的方案数
    • 我们考虑先借来 \(m\) 个苹果,然后可以先按问题 \(1\) 考虑,之后还回去 \(m\) 个苹果
    • \(Ans=C_{n+m-1}^{m-1}=C_{n+m-1}^n\)
  • 问题 \(3\):对于第 \(i\) 个盘子,至少要有 \(a_i\) 的苹果
    • 我们先借 \(\sum a_i\) 个苹果,然后变为问题 \(2\)
    • \(Ans=C_{n-\sum a_i+m-1}^{n-\sum a_i}\)
  • 不相邻的排列:\(1 \sim n\)\(n\) 个自然数中选 \(k\) 个,使得 \(k\) 个数中任何两个数都不相邻的方案数
    • 对于每一个选的数,我们可以默认先选择当前数前面的点,而由于开头可以不空所以 \(+1\)
    • \(Ans=C_{n-k+1}^k\)

反演

单位根反演

单位根与原根

  • 单位根:\(w_n^k=cos(\frac{2k\pi}{n})+i·sin(\frac{2k\pi}{n})=e^{i·\frac{2k\pi}{n}}\)
    • \(w_n^xw_n^y=x_n^{x+y}\)\((w_n^x)k=w_n^{xk}\)\(w_n^k=w_n^{k\bmod n}\)\(|w_n^k|=1\)
  • 原根:\(w_n^k=g^{k\frac{p-1}{n}}\)

原理

  • \([n\mid k]=\frac{1}{n}\sum_{i=0}^n w_n^{ik}\)
    • \(n\mid k\),则 \(w_n^{ik}=w_n^0=1\),则原式等于 \(1\)
    • \(n\nmid k\),则 \(\frac{w_n^{kn}-1}{w_n^k-1}\),由于分子为 \(0\),则原式等于 \(0\)

应用

  • \(\sum_{k=0}^m[n|k]f_k = \sum_{k=0}^m\frac{1}{n}\sum_{i=0}^{n-1}w_n^{ik}f_k=\frac{1}{n}\sum_{i=0}^{n-1}f(w_n^i)\) 其中 \(f_i\) 为多项式系数,\(f(x)\) 为带入求值
    • 上述转换的实质是将与 \(m\) 有关的式子,通过快速计算多项式总和,转化为与 \(n\) 有关的式子
  • [LOJ 6485] LJJ 学二项式定理
    • 题目简述:给出 \(n, s , a_0 , a_1 , a_2 , a_3(n\le10^{18},other\le 10^8)\)\(\left[ \sum_{i=0}^n \left( {n\choose i} \cdot s^{i} \cdot a_{i\bmod 4} \right) \right] \bmod 998244353\)
    • \(=\sum_{j=0}^3\sum_{i=0}^n {n \choose i}·s^i·a_j·[4\mid i-j]\)
    • \(=\frac{1}{4}\sum_{k=0}^{3}\sum_{j=0}^3\sum_{i=0}^n{n \choose i}s^ia_jw_4^{(i-j)k}\)
    • \(=\frac{1}{4}\sum_{k=0}^{3}\sum_{j=0}^3a_jw_4^{-jk}\sum_{i=0}^n{n \choose i}s^iw_4^{ik}\)
    • \(=\frac{1}{4}\sum_{k=0}^{3}\sum_{j=0}^3a_jw_4^{-jk}(sw_4^k+1)^n\)
参考实现
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll p=998244353;
constexpr ll ksm(ll a,ll b)
{
    ll ans=1;
    for(;b;b>>=1,a=a*a%p)
        if(b&1)ans=ans*a%p;
    return ans;
}
const ll inv4=ksm(4,p-2),w[4]={1,ksm(3,(p-1)/4),ksm(3,(p-1)/2),ksm(3,(p-1)/4*3)};
int main()
{
    int T;cin>>T;
    while(T--)
    {
        ll n,s,a,ans=0;cin>>n>>s;
        for(int j=0;j<4;j++)
        {
            cin>>a;
            for(int k=0;k<4;k++)
                ans+=a*w[((-j*k)%4+4)%4]%p*ksm((s*w[k]+1)%p,n%(p-1))%p;
        }
        cout<<ans%p*inv4%p<<'\n';
    }
    return 0;
}
  • BZOJ 3328 PYXFIB
    • 题目简述:给出 \(n,p,k(n\le 10^{18},k\le 2\times 10^4,p\le 10^9)\)\([\sum_{i=0}^{\lfloor\frac{n}{k}\rfloor}{n \choose ik}F_{ik}]\bmod p\)
    • \(F_0=F_1=1\)\(F_i=F_{i-1}+F_{i-2}\),保证 \(k\mid p-1\)
    • \(=\sum_{t=0}^nF_t{n\choose t}[k\mid t]\)
    • \(=\frac{1}{k}\sum_{t=0}^n\sum_{i=0}^{k-1}w_k^{it}F_t{n\choose t}\),与二项式定理只差 \(F_t\) 不是 \(F^t\)
    • 于是设矩阵 \(F\) 使得 \(F^t_{0,0}\) 为第斐波那契数列的第 \(t\)
    • \(\frac{1}{k}\sum_{i=0}^{k-1}(w_k^iF+I)^n\)\(I\) 为单位矩阵
参考实现
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
long long n,k,p;
struct Mat
{
    ll a[2][2];int n,m;
    Mat(int _n)
    {
        n=_n,m=_n;a[1][0]=a[0][1]=0;
        for(int i=0;i<n;i++)
            a[i][i]=1;
    }
    Mat(int _n,int _m){memset(a,0,sizeof a);n=_n;m=_m;}
    ll* operator[](const int id){return a[id];}
    Mat friend operator+ (Mat a,Mat b)
    {
        Mat ans(max(a.n,b.n),max(a.m,b.m));
        for(int i=0;i<ans.n;i++)
            for(int j=0;j<ans.m;j++)
                ans[i][j]=(a[i][j]+b[i][j])%p;
        return ans;
    }
    Mat friend operator* (Mat a,Mat b)
    {
        Mat ans(a.n,b.m);
        for(int i=0;i<ans.n;i++)
            for(int j=0;j<ans.m;j++)
                for(int k=0;k<ans.m;k++)
                    ans[i][j]=(ans[i][j]+a[i][k]*b[k][j])%p;
        return ans;
    }
    Mat friend operator* (Mat a,const ll b)
    {
        for(int i=0;i<a.n;i++)
            for(int j=0;j<a.m;j++)
                a[i][j]=(a[i][j]*b)%p;
        return a;
    }
};
ll ksm(ll a,ll b)
{
    ll ans=1;
    for(;b;b>>=1,a=a*a%p)
        if(b&1)ans=ans*a%p;
    return ans;
}
Mat ksm(Mat a,ll b)
{
    Mat ans(max(a.n,a.m));
    for(;b;b>>=1,a=a*a)
        if(b&1)ans=ans*a;
    return ans;
}
bool GetG(ll g){ll q=p-1;for(ll i=2;i*i<=q;i++)if(q%i==0&&(ksm(g,i)==1||ksm(g,q/i)==1))return false;return true;}
int GetG(){for(ll i=2;;i++)if(GetG(i))return i;}
int main()
{
    int T;cin>>T;
    while(T--)
    {
        cin>>n>>k>>p;
        ll invk=ksm(k,p-2),g=GetG(),w1=ksm(g,(p-1)/k),w=1;
        Mat ans(1,2);
        for(int i=0;i<k;i++)
        {
            Mat F(2,2),A(1,2);
            A[0][0]=1;A[0][1]=1;
            F[0][0]=0;F[0][1]=1;
            F[1][0]=1;F[1][1]=1;
            F=ksm(F*w+Mat(2),n);
            w=w*w1%p;A=A*F;
            ans=ans+A;
        }
        cout<<ans[0][0]%p*invk%p<<'\n';
    }
    return 0;
}

群论

定义

  • 对于集合 \(G\),与作用在 \(G\) 上的二元运算符 \(·\),满足一下 \(4\) 条性质,则称其为一个群记作 \((G,·)\)
    • 封闭性:若 \(a,b\in G\),则 \(a·b\in G\)
    • 结合律:\(a·(b·c)=(a·b)·c\)
    • 单位元:存在 \(e\in G\),满足 \(e·a=a·e=a\)
    • 逆元:任意 \(a\in G\),存在 \(a' \in G\),使得 \(a·a'=a'·a=e\)

子群

定义

  • \(H\)\(G\) 的非空子集,且 \((G,·),(H,·)\) 都是群,则 \((H,·)\)\((G,·)\) 的子群

陪群

定义

  • \(g\in G\)
  • 左陪集:\(gH=\{g·h|h\in H\}\)
  • 右陪集:\(Hg=\{h·g|h\in H\}\)

性质

  • \(|H|=|Hg|\)
  • \(g\in Hg\)
  • \(g\in H\) 等价于 \(Hg=H\)
  • \(Ha=Hb\) 等价于 \(a^{-1}·b\in H\)
  • \(Ha\cap Hb \not ={\varnothing}\)\(Ha=Hb\)
    • 证明:设 \(c\in Ha\cap Hb,h_1,h_2\in H\)\(c=h_1·a,c=h_2·b\)
    • \(h_1·h_2^{-1}=b·a^{-1}\),由 \(h_1,h_2\in H\),有 \(b·a^{-1}\in H\)\(Ha=Hb\)
  • \(G=\cup_{g\in G}Hg\)

常见表述

  • \((H,·)\)\((G,·)\) 的子群,\(G/H\) 表示 \(\{gH|g\in G\}\)
  • \((H,·)\)\((G,·)\) 的子群,\([G:H]\) 表示 \(G\)\(H\) 的不同陪集的数量

拉格朗日定理

  • \(\lvert G \rvert = [G : H] \lvert H \rvert\)
    • \(H\) 的不同陪集,要么相同,要么不交,所以上式子自然是对的

置换群

置换

  • 一个有限集合 \(S\) 到自身的双射(一一对应)称为 \(S\) 的一个置换。
  • \(S=\{a_1,a_2,\dots,a_n\}\) 的一个置换 \(f=\begin{pmatrix}a_1,a_2,\dots,a_n\\a_{p_1},a_{p_2},\dots,a_{p_n}\end{pmatrix}\)
  • 对于两个置换 \(f=\begin{pmatrix}a_1,a_2,\dots,a_n\\a_{p_1},a_{p_2},\dots,a_{p_n}\end{pmatrix}\)\(g=\begin{pmatrix}a_{p_1},a_{p_2},\dots,a_{p_n}\\a_{q_1},a_{q_2},\dots,a_{q_n}\end{pmatrix}\)\(f\)\(g\) 的乘积记为 \(g\circ f\)
  • 其值为 \(g\circ f=\begin{pmatrix}a_1,a_2,\dots,a_n\\ a_{q_1},a_{q_2},\dots,a_{q_n}\end{pmatrix}\)

置换群

  • 由所有置换作为集合 \(G\) 置换与置换的运算作为群的二元运算 \(\circ\),即 \((G,\circ)\)

循环置换

  • 可表示为 \(\begin{pmatrix} a_1,a_2,\dots,a_n \end{pmatrix}=\begin{pmatrix} a_1,a_2,\dots,a_{n-1},a_n\\ a_2,a_3,\dots,a_n,a_1 \end{pmatrix}\)

  • \(\begin{pmatrix} 1,2,3,4,5\\ 2,3,1,5,4 \end{pmatrix}=\begin{pmatrix} 1,2,3 \end{pmatrix}\circ\begin{pmatrix} 4,5 \end{pmatrix}\)

Burnside 引理

参考资料

posted @ 2024-03-09 20:27  LUHCUH  阅读(50)  评论(0)    收藏  举报