总的感受:
难...... 数学这种东西真的很考验一个人,我是典型的被题虐的。所以这里只包括了一些简单数学知识。
简单数论:
一、质数
1、单个质数的判定:① 试除法 ② Miller-Rabin
Miller-Rabin的基本思想:随机+费马小定理+二次探测定理。
Miller-Rabin :
IL int Miller_Rabin(int x) {
if (x<2) return 0;
if (x==2||x==3||x==5||x==7) return 1;
RG int i,j,k=x-1,cnt=0,now;
while (!(k&1)) k>>=1,++cnt;
//先把所有的2给提出来,然后在一个一个乘上去,这样比直接做快
for (i=1;i<=4;++i) {
if (Pow(prm[i],x-1,x)!=1) return 0; //费马小定理
now=Pow(prm[i],k,x);
if (now==1||now==x-1) continue;
now=now*now%x;
for (j=1;j<=cnt;++j,now=now*now%x)
if (now==x-1) break;
if (j>cnt) return 0;
}
return 1;
}/jike
2、质数的筛法 :① 欧拉筛 ② 线性筛
线性筛基本思想:确定每个数产生的唯一方式
只给当前数乘上一个质因子,且使得这个质因子是生成的合数的最小质因子,这样保证了合数质因子从大到小累积
线性筛 :
RG int n,m,cnt=0,i,j;
n=gi(),m=gi();
for (i=2;i<=n;++i) {
if (!minpr[i]) // 数i的最小质因子
pr[i]=1,minpr[i]=i,prime[++cnt]=i;
for (j=1;j<=cnt&&prime[j]<=minpr[i]&&prime[j]*i<=n;++j)
minpr[i*prime[j]]=prime[j];
}
3、质因数分解 :① 试除法 ② Pollard-Rho-大数质因数分解
Pollard-Rho的讲解戳上面那个链接。
关于Pollard-Rho的小优化:
① 每次算出一个差x后,不单单只看是否x|N,而是看是否gcd(x,N)>1。
② 在①的基础上,不需要每次都算gcd,而可以每127(其他数应该也行)个x累乘起来,和N算一次gcd。
对Miller-Rabin的优化:对于质数选取选择:2,3,7,61,24251据说可以保证在2的14次方,只有46856248255981判不掉。
这样可以筛出N的每一个因子,然后用Miller-Rabin判断是否为质数即可。
IL int Pollard_rho(int x,int c) {
RG int i,j,Las,now=0,res,gcd;
for (i=2;;i<<=1) {
for (j=1,Las=now,res=1;j<=i;++j) {
now=(qm(now,now,x)+c)%x,res=qm(res,abc(now-Las),x);
if (!(i%137)) {
gcd=getgcd(x,res);
if (gcd>1) return gcd;
}
if (now==Las) return x;
}
gcd=getgcd(x,res);
if (gcd>1) return gcd;
}
}
IL void Find(int x,int c) {
if (x<2||x<=ans) return;
if (Miller_Rabin(x)) {ans=max(ans,x);return;}
RG int p=x;
while (p==x) p=Pollard_rho(x,c--);
while (x%p==0) x/=p;
Find(p,c),Find(x,c);
}
题目:
二、约数
1、算术基本定理及其推论:
\[ N=\prod^{cnt}_{i=1}Pi^{ci}算术基本定理的推论(N的正约数和): \]
算术基本定理的推论(N的正约数和):
\[ \prod^{cnt}_{i=1}({\sum^{ci}_{j=0}(Pi)^{j}}) \]
2、N的正约数集合的求法:试除法
3、1~N每个数的正约数集合:倍数法
4、最大公约数:欧几里得算法
5、互质与欧拉函数:
\[ \phi(n)=n*\prod_{质数p|n}{\frac{p-1}{p}} \]
故欧拉函数的计算可在质因数分解的过程中求得。
欧拉函数的性质:
① 对于任意n>1 ,1~n中与n互质的数的和为
\[ n*\phi(n)/2 \]
② 若a,b互质,则有:
\[ \phi(ab)=\phi(a)*\phi(b) \]
实际上,一个函数f,当a,b互质时,存在
\[ f(ab)=f(a)*f(b) \]
那么f为积性函数。本文不做深究。
题目:
① 反素数
② 余数之和
三、同余
1、费马小定理:若P是质数,那么对于任意整数a,有:
\[ a^P\equiv a\mod P \]
2、欧拉定理:若正整数a,n互质,则:
\[ a^{\phi(n)}\equiv1\mod n \]
3、欧拉定理的推论:若正整数a,n互质,则对于任意整数b,有:
\[ a^b\equiv a^{b\mod{\phi(n)}}\mod n \]
4、裴蜀定理:对于任意整数a,b,存在一对整数x,y,满足:
\[ a*x+b*y=\gcd{(a,b)} \]
扩展欧几里得算法即基于上述定理。
推广:对于更加一般的方程
\[ a*x+b*y=c \]
它有解,当且仅当:
\[ \gcd{(a,b)}\mid c \]
5、乘法逆元的求法(记为inv):
① 费马小定理(若模数P为质数)。
② 扩展欧几里得算法。
③ 线性递推逆元。
6、线性同余方程:CRT & ExCRT
CRT核心思想:构造
ExCRT核心思想:合并(个人yy)
有兴趣的戳这里
7、高次同余方程:BSGS & ExBSGS
题目:
② Sumdiv
③ ExCRT模板
④ BSGS模板
⑤ ExBSGS模板
线性代数 & 组合数学:
四、矩阵乘法
主要用于加速递推。
需要特别留心的是关于类似floyd的可行矩阵的递推,可能会有点抽象。
直接上题吧:
① 石头游戏
② 数学作业
③ 花园
五、高斯消元与线性空间
1、Gauss_Jordan消元法(无回带操作)
IL void Gauss_Jordan() {
RG int i,j,k,l;
for(i=1;i<=n;++i) {
for(j=cnt+1,l=0;j<=n;++j)
if(fabs(a[j][i])>eps) {l=j;break;}
if(!l) continue;
for(j=i,++cnt;j<=n+1;++j) swap(a[cnt][j],a[l][j]);
for(j=i+1;j<=n+1;++j) a[cnt][j]/=a[cnt][i];
a[cnt][i]=1.0;
for(j=1;j<=n;++j) {
if(j==cnt) continue;
RG DB res=a[j][i]/a[cnt][i];
for(k=i;k<=n+1;++k) a[j][k]-=res*a[cnt][k];
}
}
for(i=cnt+1;i<=n;++i)
if(fabs(a[i][n+1])>eps) {puts("-1");exit(0);}
if(cnt<n) {puts("0");exit(0);}
}
// 无解输出-1 无穷解输出0
2、线性空间知识
有兴趣的戳这里
题目:
① 球形空间产生器
② 开关问题
③ 线性基模板
④ 装备购买
⑤ XOR
六、组合计数
1、加法原理 & 乘法原理
不多说。。
2、排列 & 组合:
从n个不同元素中选m个元素排成一列,产生的不同排列数量为:
\[ P^m_n=\frac{n!}{(n-m)!} \]
从n个不同元素中选m个元素组成一个集合,产生的不同集合数量为:
\[ C^m_n=\frac{n!}{(n-m)!*m!} \]
3、二项式定理:
\[ (a+b)^y=\sum_{i=0}^ya^i*b^{n-i}*C^i_n \]
4、多重集的排列 & 组合: