1.数论
1.1 整除
性质
若a∣b且b∣c则a∣c
a∣b且a∣c等价于对任意的整数x,y,有a∣(b∗x+c∗y)
a∣b等价于(m∗a)∣(m∗b),m∈Z
若a∗x+b∗y=1,且a∣n,b∣n,则a∗b∣n,x,y∈Z
第四条性质的a * x+b * y=1这里等价于a,b互质
若a * x+b * y=1我们还可以证得a,y互质,b,x互质
具体操作跟gcd有关,此处不展开
对于这个题我们可以轻易的得到这么一个结论
若a为密码,则k*a%n也为密码,k为正整数
还有一个小结论
我们一定可以找到一组p和q使得
px-qn=gcd(x,n)
x为密码,n为模数
这个可以用gcd相关的东西得到,之后再看[贝祖定理]
上面的式子我们可以理解为
p*x%n=gcd(x,n)
则由第一个结论
gcd(x,n)也为密码
引用:
设x,y是两个密码,那么(px+qy)%n也是密码。②
ax+by=GCD(x,y)一定有解,所以ax+by≡GCD(x,y) (mod n)一定有解③
因为:ax+by ≡ ax+by+pnx+qnx (mod n)
即 : (a+pn)x+(b+qn)y ≡ ax+by (mod n) ④
由③④得:
(a+p*n)x+(b+qn)*y≡GCD(x,y)一定有解
由②得:((a+pn)x+(b+qn) )%n 一定是密码(a+pn相当于②里面的p),
④=>ax+by是密码 , 进而③=>GCD(x,y) 是密码。
那么我们对于密码集
设t为所有密码的gcd
由上一个结论可知t为密码
若有比t更小的密码,那么gcd(t,p)<=p即gcd(t,p)<t矛盾,即t为最小密码
实现去找最小的t即可
#include<bits/stdc++.h>
using namespace std;
const int maxk=250005;
int cnt=0;
long long a[maxk];
long long p[20000005];
bool flag[20000005];
long long gcd(long long a,long long b){
return b?gcd(b,a%b):a;
}
int search(long long x){
int l=0,r=cnt+1;
while(l+1<r){
int mid=l+((r-l)>>1);
if(p[mid]>=x)
r=mid;
else
l=mid;
}
return r;
}
int main()
{
long long n,k;
scanf("%lld%lld",&n,&k);
for(int i=1;i<=k;i++)
scanf("%lld",&a[i]);
long long g=gcd(a[k],n);
for(int i=1;i<k;i++)
a[i]=gcd(a[i],g);
for(long long i=1;i<=sqrt(g);i++){
if(g%i)continue;
p[++cnt]=i;
if(g/i==i)break;
p[++cnt]=g/i;
}
sort(p+1,p+cnt+1);
for(int i=1;i<k;i++)
flag[search(a[i])]=1;
for(int i=1;i<=cnt;i++){
if(flag[i]){
for(int j=1;j<i;j++){
if(p[i]%p[j])continue;
flag[j]=1;
}
}
}
for(int i=1;i<=cnt;i++){
if(flag[i])continue;
printf("%lld",n/p[i]);
return 0;
}
return 0;
}
1.2 同余
同余不满足同除性
即
a≡bmodk
无法推出
a/p≡b/pmodk
至于为什么,假如p>a或b不就能锅吗
关于同余的其他性质基本可以和四则运算混在一起乱搞
1.3 最大公约数
辗转相除法求gcd
又名欧几里得算法
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
关于最小公倍数
lcm(x,y)=x*y/gcd(x,y)
就好了
感觉我最小公倍数怪没面子的
扩展欧几里得算法
顾名思义就是扩展了一下的欧几里得算法
可能扩展辗转相除法太难听了
由裴蜀定理
存在ax+by=gcd(x,y)
然后扩欧就是用来求解一组(a,b)的
原理的话我们看看欧几里得算法
gcd(a,b):
a=k1∗b+r1
r1=a−k1∗b
gcd(b,amodb)
b=k2∗amodb+r2
r2=b−k2∗amodb
直到最后你会happy的发现最后的r值就是gcd(x,y)
我们愉快的把式子回代就得到一组ax+by=gcd(x,y)的解了
void exgcd(int a,int b){
if(!b){
x=1;
y=0;
return ;
}
exgcd(b,a%b);
int tmp=x;
x=y;
y=tmp-a/b*y;
return ;
}
1.4 逆元
关于逆元
传送门
这里我们主要指乘法逆元
加法逆元有毛用啊
乘法逆元
a∗b≡1modp
那么一个val值乘上一个a mod p
想要再除掉a,乘上b即可
qaq
费马小定理
qaq
ap−1≡1modp
那么
在mod p意义下a的逆元为a^(p-2)
1.5 中国剩余定理
x≡k1modr1x≡k2modr2x≡k3modr3
g=gcd(r1,r2,…,rn)
k1≡k2≡k3≡...≡knmodg
1.6 斐波那契数
对于一个二项递推式
fi=a∗fi−1+b∗fi−2
我们称
x2−a∗x−b=0
为该式的特征方程
那么该式的通项公式则为
fi=r1∗x1i+r2∗x2i(若Δ>0)
r1,r2的值有序列的某两项算出来
原理
fi=afi−1+bfi−2设θ1+θ2=afi=(θ1+θ2)fi−1+bfi−2fi−θ1fi−1=θ2fi−1+bfi−2fi−θ1fi−1=θ2(fi−1+θ2bfi−2)令θ1θ2=−b则fi−θ1fi−1=θ2(fi−1−θ1fi−2)fi−1−θ1fi−2fi−θ1fi−1=θ2同理fi−1−θ2fi−2fi−θ2fi−1=θ1设pi=fi−θ1fi−1,qi=fi−θ2fi−1则p,q为等比数列pi=θ2i−1(f1−θ1f0)qi=θ1i−1(f1−θ2f0)(θ2−θ1)fi=θ2pi−θ1qifi=θ2−θ1f1−θ1f0θ2i−θ2−θ1f1−θ2f0θ1i由韦达定理θ1+θ2=aθ1θ2=−b则θ1,θ2为方程x2−ax−b=0的两根
除了通项公式
我们还可以用矩阵快速幂来解决这个问题
对于最简单的斐波那契来说
fi=fi−1+fi−2−−−−−−−−[1110]×[fi−1fi−2]=[fifi−1]
矩阵乘法
matrix operator *(matrix p)const{
matrix ans;
ans.clear();
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
for(int k=0;k<n;k++)
ans.x[i][j]=(ans.x[i][j]+x[i][j]*p.x[i][j]%mod)%mod;
return ans;
}
配出系数矩阵跑个快速幂
一个log就跑出来了
1.7 卡特兰数
卡特兰数的前几项为
1 2 5 14 42 132 429 1430 4862 16796 58786 208012 742900
f(n)=n+1C2nnf(n)=C2nn−C2nn−1f(n)=i=0∑n−1f(i)×f(n−i−1)f(n)=n+1f(n−1)×(4n−2)
经典模型:
1.二叉树计数问题
已知一颗二叉树有n个节点,问有多少种不同的形态
设f(x)表示有x个节点的二叉树有多少种不同的形态
设i表示左子树节点数量
f(n)=i=0∑n−1f(i)×f(n−i−1)
Catalan数
2.AB排列问题
n个A与n个B排成一排,从前1个位置到前2n个位置B的个数不能少于A的个数
问排列总方案
3.多边形分割问题
给定一个凸n边形
问有多少种方法使n边形被n-3条不相交的对角线分割成n-3个三角形
1.8 素数
1.素数的判定
暴力筛
bool check(n){
for(int i=2;i<=sqrt(x);i++)
if(x%i==0)return 0;
return 1;
}
埃氏筛
for(int i=1;i<=n;i++){
if(vis[i])continue;
prime[++cnt]=i;
for(int j=i*i;j<=n;j+=i)
vis[j]=1;
}
欧拉筛
for(int i=2;i<=n;i++){
if(!isNotprime[i])
prime[++cnt]=i;
for(int j=1;j<=cnt&&i*prime[j]<=n;j++){
isNotprime[i*prime[j]];
if(!(i%prime[j]))break;
}
}
2.素数相关定理
- 唯一分解定理
任意一个数一定能被唯一分解为若干质数的乘积
- 威尔逊定理
若p为质数 (p-1)!+1为p的倍数
(p−1)≡−1modp
- 费马定理
若p为质数,a为正整数,且a,p互质,则
ap−1≡1modp
Miller-Rabin质数测试
通过费马定理
测试p是否为质数
随机k个a
代入a^(p-1)测试是否模p余1
由于p为素数时测试一定通过
而测试一个a,一个合数p通过的几率为1/4
那么我们做5次测试时概率为1/1024
做10次概率为1/1048576
2.群论
qaq
3.组合数学
3.1 计数原理
抽屉原理
加法原理
乘法原理
容斥原理
DeMorgan定理:
A∪B=A∩BA∩B=A∪B
3.4 排列
错排
A=[a1,a2,a3,..,an]对于任意i∈[1,n]排列P满足pi!=ai
一般用D表示错排数
D=n!×(1−1!1+2!1−3!1..(−1)n×n!1)
证明:
设S为1 n的全排列集合设Ai为1 n的所有排列中第i个位置为i的所有排列的集合那么易得∣Ai∣=(n−1)!D=∣A1∩A2∩A3∩...∩An∣由DeMorgan定理D=∣A1∪A2∪A3∪...∪An∣又S=A1∪A2∪A3∪...∪An则D=n!−Cn1×(n−1)!+Cn2×(n−2)!−...(−1)n×Cnn×0!
3.5 组合
Cnm=m!×(n−m)!n!//定义Cnm=Cnn−m//n个里面选m个等于n个里面不选n−m个Cnm=Cn−1m+Cn−1m−1//杨辉三角,也可以用定义证明Cn0+Cn1+...+Cnn=2n//二项式定理,看成n位的二进制数可证