1.1 整除
定义:称a整除b , 如果 ∃q∈Z , st b=a*q ,记作 a|b.
性质:
- 传递性:如果a|b,b|c,则a|c
- a|b且a|c ↔ ∀x,y∈Z , a|(b*x+c*y)
- 若a*x+b*y=1, 且a|n,b|n,则(a*b)|n
1.2 同余
定义:a就模m来说同余于b,如果(a-b)|m,其中a b为整数,m为自然数,记作a≡b(mod m) .
性质:
- 自反性: a≡a(mod m)
- 对称性:a≡b(mod m) ,b≡a(mod m)
- 传递性:a≡b(mod m) ,b≡c(mod m),则 a≡c(mod m)
- 同加性:a≡b(mod m) ,则a+c≡b+c(mod m)
- 同乘性:a≡b(mod m) ,a*c≡b*c(mod m) a≡b(mod m) c≡d(mod m) 则a*c≡b*d(mod m)
- 同幂性:a≡b(mod m), a^n≡b^n(mod m)
- a*b mod k=(a mod k) *(b mod k) mod k
- a mod p=x,a mod q=x,p q互质,则a mod p*q=x
1.3最大公约数
1.3.1辗转相除法
int GCD(int x,int y)
{
return y==0?x:GCD(y,x%y);
}
1.3.2二进制算法(更相减损术)
x y均为偶数:GCD(x,y)=2*GCD(x/2,y/2)
x为偶数:GCD(x,y)=GCD(x/2,y)
y为偶数:GCD(x,y)=GCD(x,y/2)
x y均为奇数:GCD(x,y)=GCD(x-y,y)
int GCD(int x,int y)
{
int i,j;
if(x==0||y==0)return x+y;
for(i=0;0==(x&1);++i)//判断奇偶性,偶数循环
x>>=1;
for(j=0;0==(y&1);++j)//判断奇偶性,偶数循环
y>>=1;
if(j<i)i=j;//取较小循环次数 GCD(x,y)=2*GCD(x/2,y/2)
while(1)
{
if(x<y)swap(x,y);
x-=y;
if(x==y)return y<<i;//终止条件
while(0==(x&1))//偶数循环
x>>=1;
}
}
1.3.3最小公倍数
LCM(a,b)=a*b div GCD(a,b)
1.3.4扩展欧几里得算法
已知a b求一组x y,满足 a*x+b*y=gcd(a,b)
推导:
GCD(a,b)=GCD(b,a%b)
p*a+q*b=p*b+q*(a%b)=p*b+q*(a-a/b*b)=q*a+(p-a/b*q)*b
int extended_gcd(int a,int b,int &x,int &y)
{
int ret,tmp;
if(!b)
{
x=1;y=0;//特殊情况下的一组解
return a;
}
ret=extended_gcd(b,a%b,x,y);
tmp=x;
x=y;
y=tmp-a/b*y;//最终的x y方程的一组通解
return ret;//最终的ret是a b的最大公约数
}
1.3.5求解线性同余方程组
a*x+b*y=c:
step 1:extended(a,b,x,y)得一组通解(x0,y0)
step 2:x=x0*(c/GCD(a,b))+b*t y=y0*(c/GCD(a,b))-a*t
为了保证非负:x=(x%t+t)%t