【算法竞赛学习笔记】数论(一)-数学提升计划

38 篇文章 0 订阅
8 篇文章 0 订阅
本文介绍了数论的基础概念,包括整除性质、同余定理及其应用。讨论了如何解决二元一次不定方程、快速幂运算以及逆元计算。特别地,详细阐述了中国剩余定理的原理和求解过程,展示了数论在算法竞赛和数学问题解决中的重要作用。
摘要由CSDN通过智能技术生成

title : LINNO’s数论笔记(一)
date : 2021-8-4
tags : ACM,数论
author : Linno


在这里插入图片描述

整除

性质

1. 如 果 a ∣ b 且 b ∣ c , 那 么 a ∣ c 。 2. a ∣ b 且 a ∣ c 等 价 于 任 意 的 整 数 x 和 y , 有 a ∣ ( b ∗ x + c ∗ y ) 3. 设 m ≠ 0 , 那 么 a ∣ b 等 价 于 ( m ∗ a ) ∣ ( m ∗ b ) 4. 设 整 数 x 和 y 满 足 下 式 : a ∗ b + b ∗ y = 1 , 且 a ∣ n 、 b ∣ n , 那 么 ( a ∗ b ) ∣ n 1.如果a|b且b|c,那么a|c。\\ 2.a|b且a|c等价于任意的整数x和y,有a|(b*x+c*y)\\ 3.设m\neq0,那么a|b等价于(m*a)|(m*b)\\ 4.设整数x和y满足下式:a*b+b*y=1,且a|n、b|n,那么(a*b)|n\\ 1.abbcac2.abacxy,a(bx+cy)3.m=0,ab(ma)(mb)4.xyab+by=1,anbn(ab)n

奇妙的性质

1.如果2能整除a的末一位,则2|a

2.如果4能整除a的末两位,则4|a

3.如果8能整除a的末三位,则8|a

4.如果3能整除a的各位数字之和,则3|a

5.如果11能整除a的偶数位数字之和与奇数位数字之和的差,则11|a

6.如果一个数的末三位与末三位前面的数字组成的数之差能被7、11、13整除,那么这个数就能够被7、11、13整除。

二元一次不定方程

一般形式 a x + b y = c ax+by=c ax+by=c,此方程有整数解的充要条件是GCD(a,b)|c
设 x 0 , y 0 是 该 方 程 的 一 组 整 数 解 , 那 么 该 方 程 的 所 有 整 数 解 可 表 示 为 : x = x 0 + b G C D ( a , b ) t , y = y 0 − a G C D ( a , b ) t 设x_0,y_0是该方程的一组整数解,那么该方程的所有整数解可表示为:\\ x=x_0+\frac{b}{GCD(a,b)}t,y=y_0-\frac{a}{GCD(a,b)}t x0,y0:x=x0+GCD(a,b)bt,y=y0GCD(a,b)at

同余

性质

自反性: a ≡ a ( m o d    m ) a\equiv a(\mod m) aa(modm)

对称性: 若 a ≡ b ( m o d    m ) , 则 b ≡ a ( m o d    m ) 若a\equiv b(\mod m),则b\equiv a(\mod m) ab(modm)ba(modm)

传递性: 若 a ≡ b ( m o d    m ) , b ≡ c ( m o d    m ) , 则 a ≡ c ( m o d    m ) 若a\equiv b(\mod m),b\equiv c(\mod m),则a\equiv c(\mod m) ab(modm),bc(modm)ac(modm)

同加性: 若 a ≡ b ( m o d    m ) , 则 a + c ≡ b + c ( m o d    m ) 若a\equiv b(\mod m),则a+c\equiv b+c(\mod m) ab(modm),a+cb+c(modm)

同乘性: 若 a ≡ b ( m o d    m ) , 则 a ∗ c ≡ b ∗ c ( m o d    m ) , 若 a ≡ b ( m o d    m ) , c ≡ d ( m o d    m ) , 则 a ∗ c ≡ b ∗ d ( m o d    m ) 若a\equiv b(\mod m),则a*c \equiv b*c(\mod m),若a\equiv b(\mod m),c\equiv d(\mod m),则a*c \equiv b*d(\mod m) ab(modm)acbc(modm)ab(modm)cd(modm),acbd(modm)

同幂性: 若 a ≡ b ( m o d    m ) , 则 a n ≡ b n ( m o d    m ) 若a\equiv b(\mod m),则a^n \equiv b^n(\mod m) ab(modm)anbn(modm)

推论1: a ∗ b m o d    k = ( a m o d    k ) ∗ ( b m o d    k ) m o d    k a*b \mod k=(a\mod k)*(b\mod k)\mod k abmodk=(amodk)(bmodk)modk

推论2: 若 a m o d    p = x , a m o d    q = x , p , q 互 质 , 则 一 定 存 在 则 整 数 s , t , 使 得 a = s ∗ p + x , a = t ∗ q + x , 所 以 , s ∗ p = t ∗ q , 则 一 定 存 在 整 数 r , 使 s = r ∗ q , 所 以 , a = r ∗ p ∗ q + x , 得 出 a m o d    p ∗ q = x 若a\mod p=x,a\mod q=x,p,q互质,则一定存在则整数s,t,使得a=s*p+x,a=t*q+x,\\所以,s*p=t*q,则一定存在整数r,使s=r*q,\\所以,a=r*p*q+x,得出a\mod p*q=x amodp=x,amodq=x,p,qs,t使a=sp+x,a=tq+x,,sp=tq,r使s=rq,a=rpq+xamodpq=x

最大公约数

二进制算法(非递归求GCD)
inline int gcd(int x,int y){
	int i,j;
	if(x==0) return y;
	if(y==0) return x;
	for(i=0;(x&1)==0;i++) x>>=1; //去掉所有的2
	for(j=0;(y&1)==0;j++) y>>=1; //去掉所有的2
	if(j<i) i=j;
	while(1){
		if(x<y) x^=y^=x^=y;//若x<y,交换x,y
		if((x-=y)==0) return y<<i;
		//若x==y,gcd==x==y(就是在辗转减,while(1)控制)
		while((x&1)==0) x>>=1; //去掉所有的2 
	}
}
扩展欧几里得
int ex_gcd(int a,int b,int &x,int &y){
	if(!b){
		x=1;y=0;
		return a;
	}
	int d=ex_gcd(b,a%b,y,x);
	tmp=x;
	x=y;
	y=tmp-(a/b)*y;
	return d;
}
求解线性同余方程
//用扩展欧几里得算法解线性方程:ax+by=c 
bool linearEquation(int a,int b,int c,int &x,int &y){
	int d=ex_gcd(a,b,x,y);
	if(c%d) return false; //如果gcd(a,b)|c才有解 
	int k=c/d;
	x*=k; //+ t*b;
	y*=k; //-t*a;
	//求的只是其中一个解
	return true; 
}

快速幂

int fpow(int a,int p,int mod){ //计算a的p次方在模mod下的值
    int res=1;
    while(p){ //将a^p分治成 a^(p/2)*a^(p/2),当p为奇数时乘上a
        if(p&1) res=res*a%mod;
        a=a*a%mod;
        p>>=1;
    }
    return res;
}

逆元

a ∗ b ≡ 1 ( m o d    b ) , a , b 互 质 , 则 称 x 为 a 的 逆 元 , 记 为 a − 1 a*b\equiv1(\mod b),a,b互质,则称x为a的逆元,记为a^{-1} ab1(modb),a,bxaa1

求逆元的四种方法

①拓展欧几里得

②快速幂+费马小定理

③递推

inv[1]=1;
for(ull i=2;i<=n;i++){
	inv[i]=(ull)(p-p/i)*inv[p%i]%p;
}

唯一分解定理

任意正整数都有且只有一种方式写出其素因子的乘积表达式。

A = p 1 k 1 ∗ p 2 k 2 ∗ . . . ∗ p n k n , 其 中 p i 均 为 素 数 A=p_1^{k_1}*p_2^{k_2}*...*p_n^{k_n},其中p_i均为素数 A=p1k1p2k2...pnknpi

约数和方程

对于已经分解的整数 A = p 1 k 1 ∗ p 2 k 2 ∗ . . . ∗ p n k n A=p_1^{k_1}*p_2^{k_2}*...*p_n^{k_n} A=p1k1p2k2...pnkn

有A的所有因子之和为 S = ( 1 + p 1 + p 1 2 + . . . + p 1 k 1 ) ∗ ( 1 + p 2 + p 2 2 + . . . + p 2 k 2 ) ∗ . . . ∗ ( 1 + p n + p n 2 + . . . + p n k n ) S=(1+p_1+p_1^2+...+p_1^{k_1})*(1+p_2+p_2^2+...+p_2^{k_2})*...*(1+p_n+p_n^2+...+p_n^{k_n}) S=(1+p1+p12+...+p1k1)(1+p2+p22+...+p2k2)...(1+pn+pn2+...+pnkn)

中国剩余定理(CRT)

“三人同行七十稀,五树梅花廿一枝,七子团圆月正半,除百零五便得知。”

首先引入同余方程
{ x ≡ 2 m o d    3 x ≡ 3 m o d    5 x ≡ 2 m o d    7 \begin{cases} x\equiv 2 \mod3\\ x\equiv 3 \mod5\\ x\equiv 2 \mod7\\ \end{cases} x2mod3x3mod5x2mod7
小模数分别为5*7=35,3*7=21,3*5=15,找乘法逆元
{ 35 a ≡ 1 m o d    3 21 b ≡ 1 m o d    5 15 c ≡ 1 m o d    7 \begin{cases} 35a\equiv 1 \mod 3 \\ 21b\equiv 1 \mod 5 \\ 15c\equiv 1 \mod 7 \\ \end{cases} 35a1mod321b1mod515c1mod7

我们可以解得逆元a=2,b=1,c=1,于是有下列式子
{ x ≡ 70 m o d    105 x ≡ 21 m o d    105 x ≡ 15 m o d    105 \begin{cases} x\equiv 70 \mod 105 \\ x\equiv 21 \mod 105 \\ x\equiv 15 \mod 105 \\ \end{cases} x70mod105x21mod105x15mod105

这里70=2*5*7,21=3*7,15=3*5(都是不同方程里面的素因子)

我们可以求得 2 ∗ 70 + 3 ∗ 21 + 2 ∗ 15 m o d    105 = 23 2*70+3*21+2*15\mod 105=23 270+321+215mod105=23为x的解

定义

设 m 1 , m 2 , . . . , m r 两 两 互 素 , 并 记 N = m 1 ∗ m 2 ∗ . . . ∗ m r , 则 同 余 方 程 { x ≡ b 1 m o d    m 1 x ≡ b 2 m o d    m 2 . . . x ≡ b r m o d    m r 在 模 N 同 余 的 意 义 下 有 唯 一 解 。 设m_1,m_2,...,m_r两两互素,并记N=m_1*m_2*...*m_r,则同余方程\\ \begin{cases} x\equiv b_1 \mod m_1 \\ x\equiv b_2 \mod m_2 \\ ... x\equiv b_r \mod m_r \\ \end{cases}\\在模N同余的意义下有唯一解。 m1,m2,...,mrN=m1m2...mrxb1modm1xb2modm2...xbrmodmrN

由 于 m i 两 两 互 质 , 令 x = ( N / m i ) ∗ y , 方 程 组 等 同 于 解 同 余 方 程 ( N / m i ) y ≡ 1 m o d    m i , 得 到 特 解 y i , 则 方 程 组 的 解 为 : x 0 = b 1 x 1 + b 2 x 2 + . . . + b r x r m o d    N , 在 模 N 意 义 下 唯 一 。 由于m_i两两互质,令x=(N/m_i)*y,方程组等同于解同余方程(N/m_i)y\equiv 1 \mod m_i ,得到特解y_i,则方程组的解为:x_0=b_1x_1+b_2x_2+...+b_rx_r \mod N,在模N意义下唯一。 mix=(N/mi)y(N/mi)y1modmiyix0=b1x1+b2x2+...+brxrmodN,N

模板
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
//P1495 【模板】中国剩余定理(CRT)/曹冲养猪

long long n,mul=1,m[16],a[16],mi[16],x,ans=0;

void exgcd(ll a,ll b,ll &x,ll &y){
	if(!b){
		x=1;y=0;
		return;
	}
	exgcd(b,a%b,x,y);
	ll tmp=x;
	x=y;
	y=tmp-a/b*y;
}

int main(){
	scanf("%lld",&n); //同余方程个数
	for(int i=1;i<=n;i++){
		scanf("%lld%lld",&x,&a[i]); //余数和模数
		m[i]=x; 
		mul*=x; //记录大模数N
	}
	for(int i=1;i<=n;i++){
		mi[i]=mul/m[i]; //
		ll x,y;
		exgcd(mi[i],m[i],x,y);
		ans+=a[i]*mi[i]*(x<0?x+m[i]:x);
	}
	printf("%lld",ans%mul);
	return (0^0);
}
总结步骤

求大模数M

对于每个小模数p=M/m,求模m意义下的逆元i,那么p*i*a就是满足方程的最小数

每个方程的最小数相加模M,就是方程组最小解。

其他

**完全数(完美数):**全部因数之和等于他本身

**盈数:**全部因数之和大于他本身

**亏数:**全部因数之和小于他本身

**亲和数:**一个属的真因子的和等于另一个数

参考代码

luoguP3518 [POI2011]SEJ-Strongbox:https://www.luogu.com.cn/record/54555918

UVA374 Big Mod:https://www.luogu.com.cn/record/54557937

UVA11105 H-半素数 Semi-prime H-numbers:https://www.luogu.com.cn/record/54559621

UVA756 Biorhythms:https://blog.nowcoder.net/n/037e60b2ee124f6286e2b105b7e4c9bf

参考资料

信息学奥赛之数学一本通 (林厚从)

https://www.bilibili.com/video/BV1o5411T7Np?from=search&seid=3644460168410828006

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RWLinno

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值