数学
组合数学
- \(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}\)

浙公网安备 33010602011771号