数学学习笔记
写在前面
这边大概把重要的都证明了一遍,希望能对大家有帮助!更多进阶技巧详见这个和这个
数论基础
1.辗转相减
利用辗转相减法求最大公约数, 即 \(\gcd(a, b)\)。假设 \(a > b\), 则 \(\gcd(a, b) =\gcd(a − b, b)\), 不断的利用大的数减去小的数,就能得到最大公约数。
证:若 \(n,m(n>m)\) 互质,则 \((n-m) , m\) 互质
若不互质,则设 \(n - m = k * a , m = k * b\)
\(\therefore n-k*b=k*a\)
\(\therefore n=k*(a+b)\),与 \(n,m\) 互质矛盾,得证
证:若 \(n>m\) 且 \(\gcd(n,m)<m\),\(\gcd(n,m)=\gcd(n-m,m)\)
那么设 \(\gcd(n,m)=k\),则 \(n=ak,m=bk (a>b>1)\)
辗转相减后变成 \(\gcd(n-m,m)=\gcd((a-b)k,bk)\)
因为 \(\gcd(a,b)=1\) 那么 \(\gcd(a-b,b)=1\) 然后就证完了
辗转相除
我们发现当 \(a\) 一直大于 \(b\) 的时候,就会一直减去 \(b\),其实就是变成 \(a\mod b\),所以就变成了辗转相除
2.扩展欧几里得(exgcd)
解的存在性:
裴蜀定理
对于任意 \(n\) 个整数,存在以种线性组合使得其等于所有数的最大公约数。
若 \(a,b\) 是整数,且 \(\gcd(a,b)=k\),那么对于任意的整数 \(x,y,ax+by\) 都一定是 \(k\) 的倍数。
证:一定存在整数 \(x,y\),使 \(ax+by=\gcd(a,b)\) 成立。
不太好证,采用数形结合的方法
皮克定理 : 给定顶点坐标均是整点(或正方形格点)的简单多边形,面积 \(S\) 和内部格点数目 \(n\)、多边形边界上的格点数目 \(k\):\(S=n+\frac{k}{2} -1\)
\(\because \gcd(a, b)=1\)
\(\therefore AO\) 上无整点
在矩形 \(ABCO\) 中找离 \(AO\) 最近的格点 \(P(n,m)\)
\(\Delta A P O\) 边界上和内部无整点(如果有的话那个点肯定跟优,与假设矛盾)
\(\therefore S\Delta A P O=0+\frac{3}{2}-1=\frac{1}{2}\)
\(\because AO=\sqrt{a^2+b^2}\)
\(\therefore PH=\frac{\left |bn-am \right |}{\sqrt{a^2+b^2} }\) (点到直线距离公式)
\(\therefore S\Delta A P O=\frac{1}{2}\sqrt{a^2+b^2} *\frac{\left |bn-am \right |}{\sqrt{a^2+b^2} }=\frac{1}{2}\left |bn-am \right |\)
\(\therefore \left |bn-am \right |=1\)
所以当 \(x=m,y=-n\) 或 \(x=-m,y=n\)
时等式成立
所以当 \(c\) 是 \(\gcd(a, b)\) 的倍数的时候,方程有解,将 \(x,y\) 同时扩大多少倍即可
若 \(b*x_{1}+a \bmod b *y_{1}=\gcd(a, b)\)
\(\therefore b*x_{1}+(a-\left \lfloor \frac{a}{b} \right \rfloor *b) *y_{1}=\gcd(a, b)\)
\(\therefore a*y_{1}-b*(x_{1}-\left \lfloor \frac{a}{b} \right \rfloor *y_{1}) =\gcd(a, b)\)
\(\therefore x=y1,y=x_{1}-\left \lfloor \frac{a}{b} \right \rfloor *y_{1}\)
(代码有些不好理解)
\(exgcd\) 大致分为两步:
先求出 \(\gcd\) 然后利用这个 \(\gcd\) 解出一个解(不是真真的解),然后不断扩大
int exgcd(int a,int b,int &x,int &y){
int d=a;
if(b!=0){
d=exgcd(b,a\mod b,x,y);
x-=a/b*y;
swap(x,y);
}
else{
x=1,y=0;
}
return d;
}
当我们做到最后的时候,因为辗转相 \(mod\) ,我们的 \(a\) 就是 \(\gcd\),所以我们此时把 \(x\) 设为 1 即可。至于怎么 exgcd 智能一点,也就是把那些烦人的特判都搞掉我们在这里改动是不是就可以了
int exgcd(int a,int b,int &x,int &y,int c){
int d;
if(b!=0){
d=exgcd(b,a\mod b,x,y);
x-=a/b*y;
swap(x,y);
}
else{
if(c\mod a!=0) return -1;
x=c/a,y=0;
return a;
}
return d;
}
这样就好了,exgcd 其实还是很难的,给自己这么久还没有研究透一个解释hhh
3.乘法逆元
设 \(\frac{a}{b} \bmod p = x\)
\(\therefore \frac{a}{b} \equiv x \bmod p\)
\(\therefore a \equiv bx \pmod{p}\)
设 \(a \bmod p=k_{1}.....n\)
\(bx \bmod p=k_{2}.....n\)
\(\therefore k_{1}*p+n=a,k_{2}*p+n=bx\)
\(\therefore k_{2}*p+a-k_{1}*p=bx\)
\(\therefore a+p*(k_{2}-k_{1})=bx\)
\(\therefore p*(k_{1}-k_{2})+bx=a\)
既然 \(a,b,p\) 都知道,我们就可以用 exgcd 啦
有理数取余
\(\frac{a}{b} \equiv x \pmod{p}\)
$a \equiv bx \pmod{p} $
先求 \(1 \equiv bx_{1} \pmod{p}\)
再将 \(a \equiv b*a*x_{1} \pmod{p}\)
\(a*x_{1}\) 即为所求答案
4.高斯消元
非常好理解,之前我被 @【数据删除】称为高斯消元高手,为了不负期望,我决定复习一次。
#include<iostream>
using namespace std;
int n,st;
double a[105][105];//第i个方程的第j个未知数的系数
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n+1;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){//消第i个未知数
int st=i;
for(int j=i+1;j<=n;j++){
if(a[j][i]>a[st][i]){//选取一个最大值减小误差
st=j;
}
}
for(int j=1;j<=n+1;j++){
swap(a[i][j],a[st][j]);//i和st对换
}
if(a[i][i]==0){
puts("No Solution");
return 0;
}
for(int j=1;j<=n+1;j++){
if(i!=j){
//当前消到第i个未知数,那么当做到第j个方程时,其第i个未
//知数的系数就是a[j][i],那么这个方程就应该整体减去
//a[j][i]/a[i][i]倍的方程i
for(int k=i+1;k<=n+1;k++){//前面已经都是0了
a[j][k]-=a[i][k]*a[j][i]/a[i][i];
}
}
//相当于将其他方程的这一位都消成0了,因为前面是0,所以并不会改变前面的
}
}
for(int i=1;i<=n;i++){
printf("\mod .2lf\n",a[i][n+1]/a[i][i]);
}
return 0;
}
我再也不写高斯约旦了,这个【】逆天错误太多了
整体思路就是我们可以先在某一个式子里,用这个式子的 \(x\) 消去其他式子里的 \(x\) ,然后在剩下的两个式子里再选择一个式子里的 \(y\) ,用这个 \(y\) 消去最后剩下的式子里的 \(y\) 。那么现在最后一个方程里就只有一个未知数 \(z\) 了
for1(i,1,n){
int id=i;
for1(j,i+1,n) if(fabs(a[j][i])>fabs(a[id][i])) id=j;
if(i!=id) swap(a[i],a[id]);
double div=a[i][i];
for1(j,i,n+1) a[i][j]/=div;
for1(j,i+1,n){
div=a[j][i];
for1(k,i,n+1){
a[j][k]-=a[i][k]*div;
}
}
}
for3(i,n,1){
ans[i]=a[i][n+1]/a[i][i];
for3(j,i-1,1){
ans[j][n+1]-=a[j][i]*ans[i];
a[j][i]=0;
}
}
费马小定理
证明还是比较巧妙的
定义
若 \(p\) 为质数,\(\gcd(a, p) = 1\),则 \(a^{p - 1} \equiv 1 \pmod{p}\)。
另一个形式:对于任意整数 \(a\),有 \(a^p \equiv a \pmod{p}\)。
证明
设一个质数为 \(p\),我们取一个不为 \(p\) 倍数的数 \(a\)。
构造一个序列:\(A=\{1,2,3\dots,p-1\}\),这个序列有着这样一个性质:
证:\(A_i\times a \pmod p\) 都是独一无二的
使用反证法
\(n\times A_{i}\equiv m\times A_{j}\pmod p\)
\(a\times A_{i}+k\times p=a\times A_{j}\)
\(k\times p=a(A_{j}-A_{i})\)
\(k=\frac{a(A_{j}-A_{i})}{p}\)
因为 \(a<p且\gcd(A_{j}-A_{i},p)=1\)
所以不可能成立
又因为每一个 \(A_i\times a \pmod p\) 都是独一无二的,且 \(A_i\times a \pmod p < p\)
得证(每一个 \(A_i\times a\) 都对应了一个 \(A_i\))
设 \(f=(p-1)!\), 则 \(f\equiv a\times A_1\times a\times A_2\times a \times A_3 \dots \times A_{p-1} \pmod p\)
证毕。
欧拉定理
证明和上面类似
若 \(\gcd(a,m)=1\)
\(a^{\phi(m)}\equiv 1\pmod m\)
\(\phi(m)\) 代表 \(m\) 里面有这么多数和 \(m\) 互质,那么我们把这些数给搞出来,记为序列 \(A\)
证明:
\(\prod\limits_{i=1}^{\phi(m)} A_{i}\equiv \prod\limits_{i=1}^{\phi(m)} A_{i}\times a\)
我们可以保证 \(A_{i}\times a\) 之后还与 \(m\) 互质,这个是简单的然后就和上面一样了
拓展欧拉定理
感觉有点奇怪的!不要严谨的证明了!我们直接开始直观理解吧!
前两个式子都简单,我们主要看最后一个式子。
容易发现我们如果知道了一个 \(a_{i}\) 就可以很轻松知道 \(a_{i+1}\) 所以我们把这个看作一个图,然后 \(i+1\) 就可以通过 \(i\) 得到,那么我们这个就是一个图,由于每个点只有一条出边,那么这就是一个基环树,因为我们只有从 \(i+1\) 连到 \(i\) 的边,那么这就应该是一条链连到一个环。
上面既然我们分讨了这个 \(\gcd\),那么说明我们这个图的形态和这个 \(\gcd\) 有关,如果 \(\gcd=1\) 了,那么说明已经在这个环里了,我们需要证明再怎么乘 \(\gcd\) 还是等于 \(1\) 的。很好理解吧,利用辗转相减法即可。否则如果 \(\gcd!=1\) 那么就还没到环里。
CRT:
不妨验证解为什么正确。以第一个方程为例因为乘了最小公倍数,因为两两互素那么其他乘上逆元不会对
模 \(mod_{1}\) 产生影响假设其他数乘起来也就是 \(m_{1}\mod mod_{1}\) 那么我们只需将这个模数扩大即可。所以要求下逆元再乘 \(a_{1}\) 就可以了
EXCRT
这个不可以用在crt上吗qwq
考虑合并
\(x=k_{1}*mod_{1}+a_{1}\)
\(x=k_{2}*mod_{2}+a_{2}\)
\(k_{1}*mod_{1}+a_{1}=k_{2}*mod_{2}+a_{2}\)
\(a_{1}-a_{2}=k_{2}*mod_{2}-k_{1}*mod_{1}\)
\(x=k_{1}*a_{1}+b_{1}\)
\(x=k_{2}*a_{2}+b_{2}\)
\(k_{1}*a_{1}+b_{1}=k_{2}*a_{2}+b_{2}\)
\(b_{1}-b_{2}=k_{2}*a_{2}-k_{1}*a_{1}\)
\(x=K*(a_{1}*a_{2}/g)+B\)
使用 exgcd 求出特解 \(k_{1}\)
注:我们最后 \(x\) 的通解形式就是 \(x\equiv g \pmod {lcm(mod_{1},mod_{2})}\)
然后因为我们解出了 \(k_{1},k_{2}\) 我们就可以知道 \(x\) 的值,那么我们只要将这个值 \(\mod lca(a_{1},a_{2})\) 就可以了,道理很简单,就是我们这个 \(x\) 肯定是符合这个同余式的。
逻辑运算
学学玩的
-
对于一个仅由 \(\land\) 或 \(\lor\) (加不加 \(!\))都一样是满足交换律的,枚举易证.
-
\(!(p \land q)=!p \lor !q\)
-
\(!(p \lor q)=!p \land !q\)
-
韦恩图很厉害,能解决三个命题以下的问题
写于8月28的莫反,今天励志要学懂。莫反听一遍不懂一遍
数论进阶
一、数论分块
1.最大的使 \(\lfloor{\frac{n}{x}} \rfloor=\lfloor{\frac{n}{i}} \rfloor\) 的 \(x\) 是 \(\lfloor{\frac{n}{\lfloor{\frac{n}{i}} \rfloor}} \rfloor\)
证:
设 \(\lfloor{\frac{n}{i}} \rfloor=k\)
\(\because k \le \frac{n}{i}\)
\(\therefore \lfloor{\frac{n}{k}}\rfloor \ge \lfloor{\frac{n}{\frac{n}{i}}}\rfloor\)
\(\therefore \lfloor{\frac{n}{k}}\rfloor \ge i\)
\(\therefore i \le \lfloor{\frac{n}{k}}\rfloor\)
因为 \(k\) 是定值,那么 \(i\) 的最大值就是 \(\lfloor{\frac{n}{\lfloor{\frac{n}{i}} \rfloor}} \rfloor\)
二、积性函数
证: \(\phi\) 为积性函数
\(\phi (n)=n*\prod\limits_{p_{1}|n}(1-\frac{1}{p_{1}})\)
\(\phi (m)=m*\prod\limits_{p_{2}|m}(1-\frac{1}{p_{2}})\)
\(\gcd(n,m)=1\)
因为互质,所以任意 \(p_{1}\) 都不等于 \(p_{2}\),得证
证:\(\sum\limits_{d|n} \phi(d)=n\)
OI-wiki上的证法比zb妙一点。
首先设 \(f(x)为\gcd(i,n)=x\) 的 \(i\) 的个数
\(\sum\limits_{i=1}^{n} f(i)=n\)(显然)
\(\sum\limits_{d|n} f(d)=n\)
考虑 \(f\) 和 \(\phi\) 的关系
显然 \(f(x)=\phi(\frac{n}{x})\)
然后因为对称性就完了
常见积性函数
单位函数 \(e(n)=[n=1]\)
幂函数 \(id_{k}(n)=n^{k}\) 其中 \(id_{1}(n)\) 常被记作 \(id(n)\)
常函数 \(k(n)=k\)
除数函数 \(\sigma_{k}(n)=\sum\limits_{d|n} d^{k}\) 当 \(k=0\) 时为因数个数函数 \(d(n)\) 当 \(k=1\) 时为因数和函数为 \(\sigma(n)\)
欧拉函数 \(\phi(n)=\sum[\gcd(i,n)=1]\)
莫比乌斯函数
\(\mu(n)=\begin{cases}1\ \ \ \ \ \ \ \ \ \ \ \ n=1 \\0\ \ \ \ \ \ \ \ \ \ \ \ n有平方因子 \$-1)^{k} ,k为n的本质不同质因子个数\end{cases}\)
三、莫比乌斯函数
证积性
感性一下,如果和 \(\mu(1)\) 乘显然,然后和不为 1 的乘也显然
证 \(\sum\limits_{d|n} \mu(d)=[n=1]\)
设 \(n=\prod p_{i}^{c_{i}},m=\prod p_{i}\)
原式 \(=\sum\limits_{d|m} \mu(d)=[m=1]\)
设因数个数为 \(k\)
\(\sum\limits_{d|m} \mu(d)=\sum\limits_{i=0}^{k} {k\choose i} (-1)^{i}\)
\(=\sum\limits_{i=0}^{k} {k\choose i} (-1)^{i}*1^{k-i}\)
二项式定理
\(=((-1)+1)^{k}\)
根号求 \(\mu\)
适用于要求的比较大并且数量较小的时候
首先前两种情况用根号都很简单
考虑最后一种情况,和上面一样吧
根号求 \(\phi\)
根据定义,我们希望我们每个质因子都被除一次,所以我们就在第一次遍历到的时候直接除完这个因子,显然正确
int phi(int n){
if(n==1) return 1;
int ans=n;
for(int i=2;i*i<=n;i++){
if(n%i==0){
ans=ans/i*(i-1);
while(n%i==0) n/=i;
}
}
if(n>1) ans=ans/n*(n-1);
return ans;
}
线性筛求 \(\mu\)
void get(){
mu[1]=1;
for1(i,2,n){
if(!vis[i]){
mu[i]=-1;
cnt++;
num[cnt]=i;
}
for(int j=1;i*num[j]<=n&&j<=cnt;j++){
vis[i*num[j]]=1;
if(i\mod num[j]==0){
mu[i*num[j]]=0;
break;
}
mu[i*num[j]]=-mu[i];
}
}
}
四、狄利克雷卷积
卷积定义
对于两个序列 \(a,b\),我们搞出其的生成函数,然后把生成函数乘起来,然后再把系数当作序列。我们观察序列的变换,这个就是卷积了。
卷积性质
卷积对应着一种运算,比如狄利克雷卷积就是因子那种东西,而 \(FFT\) 对应的就是加法。
如果运算有交换律,那么卷积也有交换律。
如果运算有结合律,那么卷积也有结合律。
利用生成函数理解,考虑几次项上面对应的系数即可
分配律同样可以用生成函数理解
\(*\) 表示卷积 \(·\) 表示乘。\(f,g\) 为数论函数(定义域为整数的函数,通常值域也为整数)
\((f * g)(n)=\sum\limits_{d|n} f(d)g(\frac{n}{d})\)
证:若 \(f,g\) 为积性函数,那么 \(f * g\) 也是积性函数
\((f*g)(n)=\sum\limits_{d|n} f(d)g(\frac{n}{d})\)
\((f*g)(m)=\sum\limits_{d|m} f(d)g(\frac{m}{d})\)
\((f*g)(n·m)=\sum\limits_{d|n·m} f(d)g(\frac{n·m}{d})\)
\((f*g)(n)*(f*g)(m)=\sum\limits_{d|n} f(d)g(\frac{n}{d})·\sum\limits_{d|m} f(d)g(\frac{m}{d})\)
\((f*g)(n)*(f*g)(m)=\sum\limits_{d_{1}|n,d_{2}|m} f(d_{1})g(\frac{n}{d_{1}})f(d_{2})g(\frac{m}{d_{2}})\)
\((f*g)(n·m)=\sum\limits_{d_{1}|n,d_{2}|m} f(d_{1}·d_{2})g(\frac{n·m}{d_{1}·d_{2}})\)
因为 \(\gcd(n,m)=1\)
\((f*g)(n·m)=\sum\limits_{d|n·m} f(d)g(\frac{n·m}{d})\)
\(id_{k}*1=\sigma_{k}\)
\((id_{k}*1)(n)=\sum\limits_{d|n}id_{k}(d)\)
\((id_{k}*1)(n)=\sum\limits_{d|n}d^{k}\)
\(\phi*1=id\)
\((\phi*1)(n)=\sum\limits_{d|n} \phi(d)\)
\((\phi*1)(n)=n\)
五、狄利克雷卷积的性质
交换律
对称性易得
结合律
\((f*g)*h(n)=f*(g*h)(n)\)
左式 \(=\sum\limits_{d|n} (f*g)(d)h(\frac{n}{d})\)
\(=\sum\limits_{d|n} h(\frac{n}{d})\sum\limits_{d_{1}|d} f(d_{1})g(\frac{d}{d_{1}})\)
右式 \(=\sum\limits_{d|n} (g*h)(d)f(\frac{n}{d})\)
\(=\sum\limits_{d|n} f(\frac{n}{d})\sum\limits_{d_{1}|d} g(d_{1})h(\frac{d}{d_{1}})\)
因为都穷尽了将 \(n=a·b·c\) 的方案,所以相等
分配律
\(f*(g+h)(n)=f*g(n)+f*h(n)\)
原式 \(=\sum\limits_{d|n} f(d)*(g(\frac{n}{d})+h(\frac{n}{d}))\)
\(=\sum\limits_{d|n} f(d)*g(\frac{n}{d})+\sum\limits_{d|n} f(d)*h(\frac{n}{d})\)
即 \(f*g(n)+f*h(n)\)
单位元 \(e\)
任何函数卷 \(e\) 都是自己
\(\sum\limits_{d|n} f(d)e(\frac{n}{d})\)
当 \(d=n\) 时 \(e\) 为 1,其他都为 0,即为 \(f(n)\)
证 \(e=\mu *1\)
原式 \(=\sum\limits_{d|n} \mu(d)\)
即为 \(e\)
证 \(\mu * id=\phi\)
\(\because \phi*1=id\)
\(\therefore \phi=id*\mu\)
狄利克雷逆元
若 \(f*g=e\) 那么 \(g\) 就是 \(f\) 的逆元,\(g\) 记作 \(f^{-1}\)
证 \(f^{-1}\) 为
\(\begin{cases} \frac{1}{f(1)} \ \ \ \ \ \ \ \ \ \ \ \ n=1 \\ -\frac{1}{f(1)}\sum\limits_{d|n,d>1} f(d)g(\frac{n}{d})\ \ \ \ otherwise \end{cases}\)
当 \(n=1\) 时
\(\sum\limits_{d|1} f(d)g(\frac{n}{d})\)
\(=f(1)g(1)=1\)
\(g(1)=\frac{1}{f(1)}\)
否则
\(\sum\limits_{d|n} f(d)g(\frac{n}{d})=0\)
\(=f(1)g(n) \sum{d|n,d>1} f(d)g(\frac{n}{d})\)
\(=f(1)*(-\frac{1}{f(1)}\sum\limits_{d|n,d>1} f(d)g(\frac{n}{d}))+\sum{d|n,d>1} f(d)g(\frac{n}{d})=0\)
得证
证积性函数的逆元也是积性函数
不会,但很好记
五、莫比乌斯反演的证明
\(f(n)=(g*1)(n)=\sum\limits_{d|n} g(d)\)
\(g(n)=(f*\mu)=\sum\limits_{d|n} f(d)\mu(\frac{n}{d})\)
\(f=g*1\) 那么 \(g=f*\mu\)
\(f=g*1\)
\(f*\mu=g*1*\mu\)
\(f*\mu=g*e\)
\(f*\mu=g\)
交换求和顺序
是个很好用的东西
\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m} a_{i,j}=\sum\limits_{j=1}^{m}\sum\limits_{i=1}^{n} a_{i,j}\)
\(\sum\limits_{i=1}^{n}\sum\limits_{j=i}^{m} a_{i,j}=\sum\limits_{j=1}^{m}\sum{i=1}^{j} a_{i,j}\)
\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{i} a_{i,j}=\sum\limits_{j=1}^{m}\sum{i=j}^{n} a_{i,j}\)
上面几个画图很好理解,还可以通过考虑贡献来解决
若是更一般的求和式,如何处理呢?
交换原则:入内求交,出外求并
意思是:外层变量移动到内层,需要将内外限制条件取交以限制它;
而内层变量移动到外层,需求内外限制条件的并。
外层 \(i \in A\), 内层 \(j \in B(i)\),
-> 外层 \(j \in \bigcup B(i)\), 内层 \(i \in {i \in A | j \in B(i)}\)
将上面的用一下试试
\(\sum\limits_{i=1}^{n}\sum\limits_{j=i}^{n} a_{i,j}\)
\(j\) 的范围 \(\bigcup^{n}_{i=1} [i,n]=[1,n]\)
\(i\) 的范围 \([1,n]\bigcup[j,n]=[1,j]\)
\(i\) 的范围来自于 \(i\) 自己的限定和如果固定 \(j\) 对 \(i\) 的限定
\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{i} a_{i,j}\)
\(j\) 的范围 \(\bigcup^{n}_{i=1} [1,i]=[1,n]\)
\(i\) 的范围 \([1,n]\bigcap[j,n]=[j,n]\)
例1:
不会
\(\sum\limits_{i=1}^{n} \phi(i)\lfloor{\frac{n}{i}}\rfloor\)
\(\sum\limits_{i=1}^{n} \phi(i) \sum\limits_{i|j}^{n} 1\)
\(\sum\limits_{i=1}^{n} \sum\limits_{i|j}^{n} \phi(i)\)
\(\sum\limits_{j=1}^{n} \sum\limits_{i|j} \phi(i)\)
\(\sum\limits_{j=1}^{n} j\)
\(\frac{n*(n+1)}{2}\)
例2:莫比乌斯反演的另一种证法
已知 \(f(n)=\sum\limits_{d|n} g(d)\)
求证 \(g(n)=\sum\limits_{d|n} f(\frac{n}{d})\mu(d)\)
原式 \(=\sum\limits_{d|n} \sum\limits_{d_{1}|\frac{n}{d}} g(d_{1})\mu(d)\)
\(=\sum\limits_{d|n} \sum\limits_{d_{1}|\frac{n}{d}} g(d_{1})\mu(d)\)
交换原则:入内求交,出外求并
\(d_{1}\) 范围,显然 \(d_{1}\) 范围是 \(d_{1}|n\),因为对称性,将 \(d_{1}|\frac{n}{d}\) 变为 \(d_{1}|n\) 易证
\(d\) 范围,考虑 \(d_{1}\) 固定时对 \(d\) 有什么限制。\(\frac{n}{d}\) 为 \(d_{1}\) 倍数,那么 \(d\) 就为 \(\frac{n}{d_{1}}\) 因数,证明:
\(\frac{n}{d}=k·d_{1}\)
\(\frac{n}{d_{1}}=k·d\)
\(=\sum\limits_{d_{1}|n} \sum\limits_{d|\frac{n}{d}} g(d_{1})\mu(d)\)
\(=\sum\limits_{d_{1}|n} g(d_{1})\sum\limits_{d|\frac{n}{d_{1}}} \mu(d)\)
\(=\sum\limits_{d_{1}|n} g(d_{1}) [\frac{n}{d_{1}}=1]\)
\(=g(n)\)
请注意:求并操作做了 \(n\) 次,这是因为内层变量在枚举过程中受到外层 \(n\) 次限制。而求交操作只做一次,因为内层无论怎么变,对外层没有影响,提到外面,范围作形式保留
例题
1.\(\sum\limits_{i=1}^{n} lcm(i,n)\)
\(\sum\limits_{i=1}^{n} \frac{i*n}{\gcd(i,n)}\)
\(n\sum\limits_{i=1}^{n-1} \frac{i}{\gcd(i,n)}+n^{2}\)
因为 \(\gcd(n,i)=\gcd(n-i,n)=\gcd(n-i,i)\) (辗转相减)
\(\frac{n}{2}\sum\limits_{i=1}^{n-1} \frac{i}{\gcd(i,n)}+\sum\limits_{i=1}^{n-1} \frac{i}{\gcd(n-i,n)}+n^{2}\)
\(\frac{n}{2}\sum\limits_{i=1}^{n-1} \frac{n}{\gcd(i,n)}+n^{2}\)
\(\frac{n^{2}}{2}\sum\limits_{i=1}^{n-1} \frac{1}{\gcd(i,n)}+n^{2}\)
\(\sum\limits_{d=1}^{d=n} \sum\limits_{d|i,d|n} \frac{1}{d}\)
\(\sum\limits_{d|n} \frac{1}{d}\sum\limits_{i=1}^{\lfloor\frac{n}{d}\rfloor} [\gcd(i,\lfloor\frac{n}{d}\rfloor)==1]\)
\(\sum\limits_{d|n} \frac{1}{d}\phi(\lfloor\frac{n}{d}\rfloor)\)
\(\sum\limits_{d|n} \frac{d}{n}\phi(d)\)
\(\frac{n^{2}}{2}\sum\limits_{d|n} \frac{d}{n}\phi(d)+n^{2}\)
投降,不会
2.\(\sum \sum lcm(i,j)\)
\(\sum \sum \frac{i*j}{\gcd(i,j)}\)
\(\sum \sum \sum \frac{i*j}{d}[\gcd(i,j)==d]\)
\(\sum \sum \sum \frac{i*j}{d}\sum\limits_{d_{1}|\gcd(\lfloor\frac{i}{d}\rfloor,\lfloor\frac{j}{d}\rfloor)}\mu\)
\(\sum \sum \sum \frac{i*j}{d}\sum\limits_{d_{1}|\frac{i}{d},d_{1}|\frac{j}{d}}\mu\)
投降,不会
3.\(\sum \sum [\gcd(i,j)==k]\)
\(\sum\limits_{i=1,\lfloor\frac{n}{k}\rfloor} \sum\limits_{i=1,\lfloor\frac{m}{k}\rfloor} [\gcd(i,j)==1]\)
\(\sum\limits_{i=1,\lfloor\frac{n}{k}\rfloor} \sum\limits_{j=1,\lfloor\frac{m}{k}\rfloor} \sum\limits_{d|\gcd(i,j)} \mu(d)\)
\(\sum\limits_{i=1,\lfloor\frac{n}{k}\rfloor} \sum\limits_{j=1,\lfloor\frac{m}{k}\rfloor} \sum\limits_{d|i,d|j} \mu(d)\)
交换求和顺序!
\(\sum\limits_{d=1}^{\frac{n}{k}} \mu(d) \sum\limits_{i=1,\lfloor\frac{n}{kd}\rfloor} \sum\limits_{j=1,\lfloor\frac{m}{kd}\rfloor} 1\)
\(\sum\limits_{d=1}^{\frac{n}{k}} \mu(d)\lfloor\frac{n}{kd}\rfloor \lfloor\frac{m}{kd}\rfloor\)
终于推对一个了!再来!
\(\sum\sum \gcd(i,j)\)
\(\sum\sum\sum [\gcd(i,j)=d]\)
\(\sum\limits_{d=1}^{n}d\sum\limits_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{d}\rfloor} \sum\limits_{d_{1}|i,d_{1}|j} \mu(d_{1})\)
交换求和顺序!
\(\sum\limits_{d=1}^{n} d\sum\limits_{d_{1}=1}^{\lfloor\frac{n}{d}\rfloor} \mu(d_{1})\lfloor\frac{n}{d·d_{1}}\rfloor\lfloor\frac{m}{d·d_{1}}\rfloor\)
杜教筛
\(\sum\limits_{i=1}^{n} (f * g)(i)\)
\(\sum\limits_{i=1}^{n} \sum\limits_{d|i} g(d)f(\frac{i}{d})\)
\(\sum\limits_{d=1}^{n} g(d)\sum\limits_{i=1}^{\lfloor\frac{n}{d}\rfloor} f(\frac{di}{d})\)
\(\sum\limits_{d=1}^{n} g(d)\sum\limits_{i=1}^{\lfloor\frac{n}{d}\rfloor} f(i)\)
\(\sum\limits_{d=1}^{n} g(d)s(\lfloor\frac{n}{d}\rfloor)\)
\(s(n)g(1)=\sum\limits_{i=1}^{n} (f * g)(i) - \sum\limits_{d=2}^{n} g(d)s(\lfloor\frac{n}{d}\rfloor)\)
\(s(n)=\frac{\sum\limits_{i=1}^{n} (f * g)(i) - \sum\limits_{d=2}^{n} g(d)s(\lfloor\frac{n}{d}\rfloor)}{g(1)}\)
所以我们的杜教筛要能快速求出 \(g,(f * g)\) 的前缀和和 \(g(1)\) 的单点值
\(\mu * 1 = e\)
1 的前缀和和 \(e\) 的前缀和和 1 的单点值都简单
\(\phi *1 = id\)
1 的前缀和和 \(id\) 的前缀和和 1 的单点值都简单
原根
定义
\(g\) 是原根,那么 \(g, g^{2}, g^{3}, \dots, g^{\phi(p)}\) 构成一个 \(p\) 的剩余系。
也就是说,这个 \(g\) 帮助我们生成一个在模意义下的互不相同的一个序列,然后这个东西是在模意义下的。
由定义可知,一个数可能有多个原根,也可能没有原根。
P6091
模板原根,有点意思!
题解
研究了一个上午,摆。我们先找到最小原根,那么就是遍历一下然后用快速幂判断,时间复杂度 \(O(n^{0.25}\log n)\),据说一个数的最小原根是 \(n^{0.25}\) 量级的。然后有一些定理吧,证明倒是看过了,但是自己还不会证。
欧拉定理
若 \(\gcd(a,m)=1\),那么 \(a^{\phi(m)} \equiv 1 \pmod{m}\)。
拉格朗日定理
模意义下的 \(n\) 次多项式,系数 \(\not\equiv 0 \pmod{p}\),在 \(\pmod{p}\) 意义下和 \(0\) 同余至多有 \(n\) 个解。
那么我们找出了最小原根 \(g\),那么对于 \(\gcd(g,x)=1\) 的所有 \(x\),\(g^{x} \mod m\) 都是原根。
怎么求呢,判原根的话先看看 \(\phi(m)\) 是否余 \(1\),然后看看因子是否余 \(1\),因为要保证最小。
题解的具体思路就是先吧定理证了,然后开始证一些性质,比如说互素的原根里面的东西乘出来的东西的原根是原来两个的乘积,然后开始证只有 \(\{1,2,3,p^{x},2p^{x}\}\) 有原根,反正还是很逆天的,之前 \(\phi\) 的东西也忘了很多了,只记得怎么用了。
非常深奥,没看懂。
主要讲我觉得在 OI 里面比较有用的性质。
阶
人话:
最小的能使 \(a^{n} \equiv 1 \pmod{m}\) 的 \(n\)。
阶的运算性质(没什么用):
\( \delta_m(ab) = \delta_m(a)\delta_m(b) \iff (\delta_m(a), \delta_m(b)) = 1 \)
\( \delta_m(a^k) = \dfrac{\delta_m(a)}{(\delta_m(a), k)} \)
原根存在定理
一个数存在原根当且仅当其为 \(2,4,p^{\alpha},2p^{\alpha}\)。
随便判断,时间 \(O(n)\)。
原根判定定理
设 \(m \geqslant 3, (g,m)=1\),则 \(g\) 是模 \(m\) 的原根的充要条件是,对于 \(\varphi(m)\) 的每个素因数 \(p\),都有 \(g^{\frac{\varphi(m)}{p}} \not\equiv 1 \pmod{m}\)。
求最小原根
枚举+判断,最小原根大约是 \(O(n^{0.25})\) 这个水平的,所以时间有保证。
所有原根
是 \(\phi(\phi(m))\) 个的。
当且仅当 \(\gcd(k,\phi(m))==1\),\(g^k\) 为原根。
枚举即可。
模意义下的乘法转加法
agc047c
我们找到模数的最小原根,然后将 \(g^{b_i}=a_i\) 这个东西可以开个桶记录一下。
然后我们 \(a[i] \times a[j]\) 就变成了 \(g^{b_i+b_j}\)。
\(b\) 的量级不大,所以我们只需统计 \(b_i+b_j\) 每一个有多少个。这个把 \(b\) 看作系数做一遍 fft 即可(没有模数)。
二次剩余
是不是只要学 Cipolla 就行了?
一个整数 \(a\) 如果在 \(\mod p\) 意义下有 \(x^{2} \equiv a \pmod{p}\) 那么我们称 \(a\) 为 \(\mod p\) 意义下的二次剩余。
判断一个数是否为二次剩余
- \(a\) 是 \(p\) 的二次剩余当且仅当 \(a^{\frac{p-1}{2}} \equiv 1 \pmod{p}\)。
- \(a\) 是 \(p\) 的二次非剩余当且仅当 \(a^{\frac{p-1}{2}} \equiv -1 \pmod{p}\)。
证明
根据费马小定理
\(a^{p-1} \equiv 1 \pmod{p}\)
\((a^{\frac{p-1}{2}} - 1)(a^{\frac{p-1}{2}} + 1) \equiv 0 \pmod{p}\)
\(a^{\frac{p-1}{2}} = \pm 1\)
设 \(x^2 \equiv a\)
若 \(a\) 是二次剩余,那么 \((x^{2})^{\frac{p-1}{2}} = x^{p-1} \equiv 1 \pmod{p}\)
证毕
求二次剩余
注意注意注意,这个 \(i\) 不是那个 \(i^2=-1\) 的那个 \(i\),这个 \(i\) 是我们设的。
求 \(x^2 \equiv n \pmod{p}\)
我们首先随机一个 \(a\) 使得 \(a^2-n\) 为非二次剩余。
那么 \(a^2-n \equiv i^2 \pmod{p}\)
引理
-
\(i^{p} \equiv i \times (i^2)^{\frac{p-1}{2}} \equiv i \times (r^2-a)^{\frac{p-1}{2}} \equiv -i \pmod{p}\)
-
\((a+b)^{p} = a^{p} + b^{p} (a,b < p)\)
考虑 \((a+i)^{p+1} \equiv (a+i)(a+i)^{p} \equiv (a+i)(a^p+i^p) \equiv (a+i)(a^p-i) \equiv (a+i)(a-i) \equiv a^2-i^2 \equiv a^2-a^2+n \equiv n\)
那么 \((a+i)^{\frac{p+1}{2}}\) 就是答案了!
方程有两个根(相反数)?到底有多少根啊如果有新的一个根的话,那么随便反正就可以了。
BSGS
这个不是根号平衡吗
\(a^{x} = b \mod p\)
设 \(t = \sqrt{p}\)
设 \(x = i \cdot t - j\)
\(a^{i \cdot t - j} = b \mod p\)
\(a^{i \cdot t} = b \cdot a^{j} \mod p\)
然后我们直接枚举 \(i\) 就行了,这么水的吗?
哦,因为我们保证了 \(a\) 和 \(p\) 互质,所以就可以这样做了,否则会出现除以 0 的情况。怎么变成互质呢。因为 \(a \cdot g = b \cdot g \mod p\)
那么 \(a = b \mod p\) 这个我们直接乘 \(g\) 的逆元即可,\(g\) 的逆元存在当且仅当
\(g = a\)
\(g \cdot x = 1 \mod p\)
\(g \cdot x = p \cdot y + 1\)
\(g \cdot x - p \cdot y = 1 \mod p\)
其中 \(x\) 与 \(y\) 为未知数,那么就是 \(g\) 和 \(p\) 互质即可。
\(a^{x} = b \mod p\)
我们不停除 \(\gcd(a,p)\),注意这里不能只除一次,有可能里面可以除好多次。然后我们最后能除出来一个东西
\(\frac{a^{cnt}}{sum} \cdot a^{x-cnt} = \frac{b}{sum} \mod \frac{p}{sum}\);
然后把左边的东西除到右边
所以 \(\frac{a^{cnt}}{sum}\) 在 \(\pmod{\frac{p}{sum}}\) 意义下有逆元,除到右边,就是正常 bsgs 了。
然后就是一些证明
如果 \(b\) 不能被 \(sum\) 整除,那么就是无解
然后我们 \(\frac{a^{cnt}}{sum}\) 必定 \(\frac{p}{sum}\) 互质,因为
如果 \(\frac{a^{cnt}}{sum}\) 和 \(\frac{p}{sum}\) \(\gcd\) 不为 1,那么就不符合性质了,所以这个是有逆元的。
卢卡斯定理
其实和生成函数没有特别大的关系,就只有里面的一个比对系数有点关系
内容
《初等数论》一书对卢卡斯 \(\texttt{(Lucas)}\) 定理是这么定义的:
设 \(p\) 为质数 \(,a,b\in N^* ,\) 并且
\(a=\sum\limits_{i=0}^k a_i p^i,b=\sum\limits_{i=0}^k b_i p^i\)
这里 \(0\leqslant a_i,b_i\leqslant p-1\)都是整数,\(i=0,1,2,…,k.\) 则:
\(C_a^b \equiv \prod\limits_{i=0}^k C_{a_i}^{b_i} \pmod{p}\)
\(C_a^b \equiv C_{a_k}^{b_k} \cdot C_{a_{k-1}}^{b_{k-1}} \cdot … \cdot C_{a_0}^{b_0}\pmod{p}\)
证明
\((1+x)^p \equiv 1+x^{p}\pmod{p}\)
Lucas 定理的证明必须要求模数p为质数,这一条件在证明过程中起到关键作用。以下为具体说明:
-
核心引理的依赖
在 Lucas 定理的证明中,核心步骤是建立引理:
\((1+x)^p \equiv 1 + x^p \pmod{p}\)
该引理的成立依赖于** \(p\) 为质数。当 \(p\) 是质数**时,组合数 \(C(p,k) \equiv 0 \pmod{p}\)(其中 \(0 < k < p\)),这是因为分子含因子 \(p\) 而分母不含 \(p\),导致整体被 \(p\) 整除。若 \(p\) 非质数,此性质不成立,例如当 \(p=4\) 时,\(C(4,2)=6 \equiv 2 \pmod{4} \neq 0\)。
性质
- 在 OI 里面,这个还有一个很优美的性质。对于 \({n\choose m}\) 其为偶数当且仅当二进制下 \(m\) 为 \(n\) 的子集。这里的证明将 \(n,m\) 二进制展开后,比对系数,注意 \({a\choose b}=0(a < b)\)
应用
-
P3807
直接 lucas。这样我们就在求逆元的方面简单了很多。
-
P5160
\(n\) 个属于 \(\in [0,m]\) 的数使其和 \(\le m\)的拆分方案,数有顺序。
我们加一个数和为 \(m\) 一样,然后就 lucas 即可。
-
P4345
发现 2333 为质数,直接使用 Lucas。因为 \(T=1e5\),我们的操作得很快。
\({n\choose m}={n\mod 2333 \choose m\mod 2333}*{ \lfloor{\frac{n}{2333}}\rfloor \choose \lfloor{\frac{m}{2333}}\rfloor}\)
还是看成 2333 进制的数,因为一个是乘,一个是加,非常不好搞。但是我们 lucas 有个很优美的性质,也就是我们每一位都必须比 \(n\) 进制分解小。不然搞出来是 0。
所以思路就明确了。我们可不可以搞个数位 dp。\(dp[i][0/1]\) 表示做到第 \(i\) 位了,是否顶到 \(k\) 的上界。如果顶到上界,那么我们组合数的上界就是 \(k\) 和 \(n\) 取 \(min\),否则就是 \(n\)。然后最后一个和,然后乘起来就可以了。时间为 \(O(T\log_{2333}^{k}*2333)\) 1e9了啊。考虑把\(\log\)消掉,我们前缀和处理一下就可以了,反正最多 \(2333^{2}\) 个组合数,然后就做完了。
exlucas
exlucas,这下比数竞高贵了。
我们将 \(p\) 拆分
\(p=\prod\limits_{i=0}^{k} b_{i}{p_{i}}\)
然后就得到了 \(k\) 个同余式
\(c(n,m)\equiv \ ? \pmod {b_{i}^{p_{i}}}\)
这个 \(?\) 是我们 lucas 要求的东西
所以我们现在就是要求 \(\frac{n!}{m(n-m)!}\pmod{p^k}\)
为了把逆元搞出来我们需要把所有数的 \(p\) 都提出来。如果我们只要求出 \(\frac{n!}{p^{x}}\)中这个式子的值并且求出 \(x\) 就行了。
先考虑求 \(x\) 吧。首先我们要明确这个 \(p\) 是质数,那么设这个为 \(g(n)=g(\lfloor\frac{n}{p}\rfloor)+\lfloor\frac{n}{p}\rfloor\) 然后就做完了
然后就是求去掉 \(p\) 的阶乘了。
\(n!=(p*2p*3p*\dots*\lfloor\frac{n}{p}\rfloor p)*(1*2*\dots*p-1)*((p+1)*(p+2)*\dots*(2p-1))\)
然后注意嗷,我们可以把这个 \(p\) 扔掉,因为外面我们用 \(g\) 函数求出来了。然后因为我们做好之后我们是可以随便求逆元和取模的那么给式子里的所有数都 \(\mod p^{k}\) 即可。
\(f(n!)=f(\lfloor\frac{n}{p}\rfloor!)*(\prod\limits_{i=0,i\mod p \ne 0}^{p^k}i)^{\lfloor\frac{n}{p^k}\rfloor}*\prod\limits_{i=p^k*\lfloor\frac{n}{p^k}\rfloor,i\mod p \ne 0}^{n}i\)
所以我们要处理出来这个东西,这个是不是花一点 \(p^{k}\) 的时间来预处理上面的东西。时间复杂度为 \(O(\sum p^{k}+\sum \log_{p}n)\) 然后就好了。
arc137d
我们每个位置都会被一个集合的数给贡献到。先不考虑复杂度,我们先考虑每个位置都被哪些位置贡献了多少次。注意到,每个位置只会被前面的数贡献到
我们把这个看作每个位置都有个桶,然后我们对其做k次前缀和
考虑每个桶贡献的次数
\(c(x)\) 就是一个桶,哈希一下不就变成一个数了吗?
\(F(x)=\sum\limits_{n=1} c(x)x^{n}\)
做一次前缀和,那么会给生成函数乘上 \(\frac{1}{1-x}\)
\(F(x)=\sum\limits_{n=1} c(n)\frac{x^{n}}{(1-x)^{k}}\)
使用广义二项式定理
\(F(x)=\sum\limits_{n=1} c(n)*((1-x)^{-k})*x^{n}\)
\(F(x)=\sum\limits_{n=1} c(n)*\sum\limits_{m=0}{-k \choose m} (-x)^{m}*x^{n}\)
\(F(x)=\sum\limits_{n=1} c(n)*\sum\limits_{m=0}\frac{(-k)(-k-1)(-k-2)\dots(-k-m+1)}{m!} (-x)^{m}*x^{n}\)
\(F(x)=\sum\limits_{n=1} c(n)*\sum\limits_{m=0}{(k)(k+1)(k+2)\dots(k+m-1)}{m!} x^{m}*x^{n}\)
\(F(x)=\sum\limits_{n=1} c(n)*\sum\limits_{m=0}{k+m-1\choose m} x^{m}*x^{n}\)
\(F(x)=\sum\limits_{n=1}\sum\limits_{m=0}{k+m-1\choose m} x^{m}*x^{n-m}\)
\(F(x)=\sum\limits_{n=1}\sum\limits_{m=0}{k+m-1\choose m} x^{m}*x^{n-m}\)
\(F(x)=\sum\limits_{n=1} x^{n}\sum\limits_{m=0}{k+m-1\choose m}\)
看看题目让我们求什么,求的是我们 \(k\in [1,m]\) 的所有 \(\sum\limits_{m=1}^{n}{k+m-1\choose m} a_{m}\) 当然这个是异或和。这个异或和,那么我们就要知道中间这个东西的奇偶性,这个好像要使用 lucas定理。
所以我们 \(k=j\) 的答案就是 \(\oplus_{i=1}^{n} (n-i\in j+n-i-1)\) 这个式子两边都有数,不是特别好做,变一下 \(\oplus_{i=1}^{n} (n-i\cap j-1=\emptyset)\) 这个东西只要我们把 \(j-1\) 全部按位取反那么 \(n-i\in (1<<20)-1-(j-1)\)
miller-rabin
我们有两个很强力的判断质数的工具,一个是二次剩余,一个是费马小定理。结合起来使用正确率貌似还挺高的,在OI里已经是确定性算法了
二次探测
若 \(p\) 为奇质数,则满足 \(x ^ 2 \equiv 1 \pmod p\) 的解为 \(x = 1 \lor x = p - 1\)。
费马小定理的逆定理
\(\exists a \in [1 , p - 1],a ^ {p - 1} \not \equiv 1 \pmod b\) 则 \(p\) 一定不为质数。
结合起来,我们先判断 \(a^{p-1}\) 是否等于 \(1\) ,如果不等于,那么这肯定是合数,否则继续检测。我们将 \(p-1\) 拆成 \(r*2^{t}\) 前面先搞出来 \(a^{r}\),然后观察下这个数,如果这个数可以作为 \(p\) 的二次剩余,那么 \(p\) 就有可能成为质数。如果过程中没有碰到数搞出来是 \(n-1\) 那么有两种情况,一种是 \(a^{p-1}\) 就不是 \(1\),那么自然也不会有 \(n-1\) 了。如果 \(a^{p-1}\) 是 \(1\) 并且 \(a^{r}!=1\),如果 \(p\) 为质数,那么中间必然会有一个 \(n-1\),因为根据二次探测,\(1\) 必然是由 \(1\) 或者 \(n-1\) 生出来的,否则就可以判断这个是合数了
pollard-rho
生日悖论
在 \(1~n\) 中随机撒 \(k\) 个点,为了使至少有两个点位置相同的概率 \(>50%\),我们 \(k\) 得多大。
我们考虑撒点的过程,每撒一个点都必须和之前不同,那么这个结论就好理解了。这么说,一个班里大概率存在一对相同的了?
思想
我们构造一个长度为 \(n\) 的排列代表映射。考虑连边,这个就是一个小尾巴连到环上。那么我们往下走相当于每次都取一个随机数,那么我们期望 \(\sqrt{\frac{\pi n}{2}}\) 次取到两个数相同。
首先 \(n\) 为合数,那么其中有一个因数必然 \(\le\sqrt{n}\) 那么我们随机\(\ ^{4}\sqrt{n}\) 数,那么其中大概率有一对数在模 \(n\) 的最小因子意义下相同,那么我们把所有的数的差做出来,然后直接取 \(\gcd\) 即可,但是这样太慢了
实现
构造序列 \(a_{n+1}=a_{n}^{2}+C \pmod p\)
注意到若 \(a_{i}\equiv a_{j} \pmod p\) ,那么 \(a_{i}^{2}+C\equiv a_{j}^{2}+C \pmod p\),所以 \(a_{i+1} \equiv a_{j+1}\)
所以我们随便取一个数,然后再维护一下它的两倍。如果 \(a_{i}\equiv a_{2i} \pmod p\),那么必然在环里了,也就是说 \(i\) 就是环的长度了。那么我们跳\(\ ^{4}\sqrt{n}\) 次。虽然这样没有检查到所有数对,但是由于前面的性质,我们其实已经检查了很多数对了,同时前面的数对也有很高的随机性。
有一些边角情况,也就是如果环的长度为 \(1\) 怎么办?很简单,我们再检查一下 \(a_{k-1}\) 和 \(a_{2k-1}\)。然后我们不停做,就可以把数质因数分解了!利用主定理可以得到复杂度为 \(\ ^{4}\sqrt{n}\log n\)
细节
这题都有细节,真的不太是人啊。
我们发现我们求 \(gcd\) 的次数好像太多了,所以我们考虑有些东西直接不取 \(gcd\) 了。也就是说,我们把一些 \(gcd\) 都乘在一起,大部分都是 \(1\),所以不太会有问题?
随机化算法真搞笑
组合数学
组合恒等式:
1.\(n \choose m\)=\(n-1 \choose m\)+\(n-1 \choose m-1\)
2.下降幂 \(n^{m}\) 就是 \(A^{m}_{n}\)
3.\(\sum\limits ^{m}_{i=0} {i \choose n}={m+1 \choose n+1}\)
4.范德蒙德卷积 \(\sum\limits^{k}_{i=0}{n \choose i}{m \choose k-i}={n+m \choose k}\)
5.\(\sum\limits_{i=0}^{n} i{n \choose i}=n*2^{n-1}\)
卡特兰数:
公式
1.\(Cat_n=\sum\limits \limits_{i=1}^{n}Cat_{i-1}Cat_{n-i}\)
2.$ Cat_n=\frac{4n-2}{n+1}Cat_{n-1} $
3.\(Cat_n=C_{2n}^{n}-C_{2n}^{n-1}=\frac{C_{2n}^{n}}{n+1}\)
例题与解释
1.经典的网格路径问题
从 \((0, 0)\) 走到 \((n, m)\),只能向上或向右走,且不穿过 \(y=x\) 这条线的方案数。显然随便走的话方案数就是 \(C_{n+m}^{n}\) 一共走 \(n+m\) 步,其中有 \(n\) 步向右走)。考虑每一条不合法路径,也就是穿过了 \(y=x\),即触碰到了 \(y=x+1\),将第一次触碰到 \(y=x+1\) 的位置记作 \(d\),那么把 \(d\) 之后的路径沿\(y=x+1\) 对称,就得到了一条从 \((0,0)\)到\((m-1,n+1)\) 的路径(相当于将 \((m,n)\) 关于 \(y=x+1\) 对称)。可以发现每一条不合法路径都唯一对应一条从 \((0,0)\) 到 \((m-1,n+1)\) 的路径,这是一个双射关系,方案数为 \(C_{n+m}^{n+1}\),最后答案为 \(C_{n+m}^{n}-C_{n+m}^{n+1}\)。特别的,当 \(n=m\) 时,就是卡特兰数。
2.括号序列
左括号的数量始终大于等于右括号,即合法的括号序列。把左右括号看做 1、-1,将 \(x\) 轴看作 \((\),\(y\) 轴看作 \()\),然后就满足了上面的性质。
3.进出栈问题
同上
这类问题都是,转化成 1 或 2 或 3 问题,通过公式 3 解决
4.阶梯的矩形划分(树屋阶梯)。
一个阶梯被若干个矩形划分的方案数。
发现 \(n\) 个角不可能处于同一个矩形,那么枚举 \(n\) 个角哪一个与左下角的方块在一个矩形内,那么上方还剩下 \(i-1\) 个角,下方还剩下 \(n-i\) 个角,则递推式如 1。
5.二叉树的构成问题(凸多边形的三角划分)
枚举左子树的大小,得到递推式 \(f_n=f_0f_{n-1}+f_1f_{n-2}……f_{n-1}f_0\)。
7.不相交弦
在一个圆上有 \(2n\) 个点,两两配对,所得的弦彼此不相交,在圆上任选两个点连接,把圆分成两部分,左侧 \(2(i-1)\) 个点,右侧 \(2(n-i)\) 个点,得到递推式。
容易发现,这个常用的是 1 和 3 公式,这通常是通过子状态转移过来(区间 dp?),当我乱说,但确实有这种感觉。