gcd(a,b)!=gcd(a%p,b%p)
贝祖定理
(a,b)代表最大公因数,则设a,b是不全为零的整数,则存在整数x,y,使得ax+by=(a,b)
应用
1.若a|bc,且(a,b)=1,则a|c
2.若a|c,b|c,且(a,b)=1,则ab|c
3.设m为正整数,则(ma,mb)=m(a,b),[ma,mb]=m[a,b] [最小公倍数]
4.设a,b都为正整数,则(a,b)·[a,b]=ab
7.26~8.1日照一中夏令营
7.26
(a-b)%p=(a%p-b%p+p)%p
ab mod p=1 a,b互为逆元
a,p互质才有逆元
没有逆元的情况下
x pair < int ,int > x=a*p^b 记录a,b
(7/6)%9
7=7*3^0 a=7,b=0
6=2*3^1 a=2,b=1
7/6=(7/2)*3^-1 (其中2对于9有逆元)
费马小定理求逆元:
a,p 互质
a^phi(p) mod p =1
贝祖定理
线性求逆元
p%a=p-(p div a)*a
移项:(p div a)*a=p-p%a
因为是在%p意义下的逆元,所以p可以直接忽略:
(p div a)*a=-p%a
除过去:
a=-(p%a)/(p div a)
a^-1=-(p div a)/(p%a)
筛素数
for (int i=2;i<=1000000;i++)
{
if (!not[i])
sshu[++tot]=i;
for (int j=1;j<=tot;j++)
{
not[i*prime[j]=1;
if (i%prime[i]==0)
break;
}
}
复数
复数x被定义为二元有序实数对(a,b) ,
记为z=a+bi,这里a和b是实数,i是虚数单位
在复数a+bi中,a=Re(z)称为实部,b=Im(z)称为虚部
当虚部等于零时,这个复数可以视为实数;
当z的虚部不等于零时,实部等于零时,常称z为纯虚数
复数域是实数域的代数闭包,也即任何复系数多项式在复数域中总有根
一些常见的数论函数
e(x)=[x=1] //[x=1]是判定式,当x==1时函数式=1,否则=0
n(x)=x
d(x)=x所有因数的个数
计算方式:x=2^p1*3^p2*5^p3…
d(x)=(p1+1)(p2+1)(p3+1)…
phi*1=n
mu*1=e
bsgs
x^y mod p =z mod p
求y的取值
y=km+i
7.27
inline 只适用于语句少,递归层数少的函数
一般写node merge(node A,node B) //
序列上的题慢慢变到了树上,估计以后就要变到仙人掌上去了
树状数组 区间修改区间查询
循环展开
for (int i=1;i<=n;i+=4)
{
四遍代码
}
期望:sigma xi*P(xi)
7.28
gcd(fi,fj)=f(gcd(i,j))
f[i]=a1*f[i-1]+a2*f[i-2]+..+ak*f[i-k]
矩阵乘法优化
有限状态自动机 五元组
平衡树
fhy treap
替罪羊树
在splay之前把该节点到根这条路径上所有标记下传
void down(int x){
if (x===0) return;down(fa[x]);push(x);
}
线段树套平衡树
空间 nlogn
只有合并,没有拆分 启发式合并(小->大)
若是插入或删除一段元素,可以将splay的一个点拆成两个点
人工栈,防止被卡,然而代码复杂度很高
7 min dinic
7.29
贪心:拟阵
拟阵定义
一个拟阵是满足下列条件的一个序对 M=(S,L):
(1)S是一个有穷集合(S is a finite set);
(2)L是S的一个非空子集簇,即L是由S的子集作为元素构成的集合,且非空;
(3)如果B∈L,并且A包含于B,则有A属于L。如果L满足此性质,则称之为遗传性;
(4)如果A∈L,B∈L并且|B|>|A|,则有一定存在一个x∈B-A,使得集合A并上{x}之后形成的集合仍属于L,该性质称为交换性。
相关定理
1、如果G=(V,E)是一个无向图,那么M=(S,L)是个拟阵。其中S是图G的边集E,而L则是由这样的E的子集构成的:A是E的子集,并且A是无回路的,则A属于L。
2、某一拟阵中的所有最大的独立子集的大小都是相同的。拟阵M=(S,L)中L的每一个元素都是S的独立子集。
拟阵来源
“拟阵”这个词是由Hassler Whitney最早开始使用的。
他曾研究矩阵拟阵,其中S是给定矩阵的各个行,
如果这些行在通常意义下是线性无关的,则他们是独立的。
拟阵应用
拟阵可以用来研究贪心算法,他是贪心算法的数学基础,
可以这么说,一个问题如果他可以转换为拟阵,那么一定可以用贪心算法进行求解;
但是并不是所有的可用贪心算法求解的问题都能转换为拟阵。
主要是用来求解最优问题
c++运算符号优先级,每次比赛前必看
最大权闭合子图
建图:如果收益为+,源点向该点连边 割这条边表示放弃这部分收益
收益为-,该点向汇点连边 割这条边表示付出这部分花费
最后答案为,sigma(收益)-最大流(花费)
2755
黑白染色
白到黑
如果n*m为偶数,那假如x可行,x+1一定可行
二分
源点向白连x-vi的流量
n*m为奇数
白 wn ws x*wn-ws
黑 bn bs x*bn-bs
联立解方程
棋盘:黑白染色
黑红蓝染色
7.30
字符串hash
BKDR hash
把每一个字符看成是一个数字
abc=1*26^2+2*26+3
进制的选择:27 233 19260817
unsigned long long 直接%2^64 进制不要选择偶数
f[i+1]=f[i]*d+x //计算hash值
[l,r] f[r]-d^(r-l+1)f[l-1]
d 预处理
企鹅qq
排序之后,统计相同hash的有多少个,n*(n-1)/2
trie 树 开不下的话 开邻接表
7.31
矩阵
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
{
register ll w=0;
for (int k=1;k<=n;k++)
{
w+=b[i][k]*c[k][j];}
a[i][j]=w%mod;
}
f[i+1][0] f[i+1][1] f[i+1][2] f[i+1][3]
f[i][0] a b c d
f[i][1] d a b c
f[i][2] c d a b
f[i][3] b c d a
a:%p==0
b:%p==1
c:%p==2
d:%p==3
循环矩阵
相乘还是循环矩阵
因此只计算第一行
3 1
1 3
1 2 (1*3+2*1) (1*1+2*3)
2 1 (2*3+1*1) (2*1+3*1)
8.1
计算几何
直线表示:点+向量
A(x0,y0) AB(x,y)
直线AB上的点C(x0+tx,y0+ty)
直线与直线的交点:
A(x1,y1) B(x2,y2)
C(x3,y3) D(x4,y4)
直线AB与CD的交点 E(x,y)
x=x1+tx2=x3+mx4;
y=y1+ty2=y3+my4;
点到直线的距离
C->AB
2S(ABC)/AB
多边形面积计算:一定要按一定的顺序(顺时针或逆时针),一定要带符号,最后再求fabs
三角形重心
((x1+x2+x3)/3,(y1+y2+y3)/3)
多边形重心
把多边形划分成多个三角形,
若多边形面积是S,某一三角形面积是S1
则该三角形的重心占多边形重心的比例(x1*S1/S,y1*S1/S)
所以多边形的重心就是把若干个三角形的重心按如上形式加起来即可
凸包:
1.极角排序(时间复杂度低)
2.两边构造上凸壳和下凸壳(点按照x和y排序)