NOIP数学知识

数学知识

质数

1.质数分布定理:在 1 ∼ N 1\sim N 1N中大约有 x ln ⁡ x \frac{x}{\ln x} lnxx个,N越大越精准

2.判断n为质数的方法:试除法:(可以顺带求出约数集合)

int t=sqrt(n);
if(n<2)return false;
for(int i=2;i<=t;i++){
   
    if(n%i==0)return false;
}
return true;

3.欧拉筛(线性筛质数):

int v[MAX_N],prime[MAX_N];
void primes(int n){
   
    memset(v,0,sizeof v); 
    int cnt=0;//质数数量 
    for(int i=2;i<=n;i++){
   
        if(!v[i]){
   
            v[i]=i,prime[++cnt]=i;
        } 
        for(int j=1;j<=cnt;j++){
   
            if(prime[j]>v[i]||prime[j]*i>n)
                break;
            v[i*prime[j]]=prime[j];

        }
    }
    for(int i=1;i<=cnt;i++)printf("%d ",prime[i]);
}

4. N ! N! N!中质数p的个数为:

∑ p k ≤ N ⌊ N p k ⌋ \sum_{p^k\le N}\left\lfloor\frac{N}{p^k}\right\rfloor pkNpkN

约数

1.设 N N N被算术基本定理分解为 N = p 1 c 1 p 2 c 2 p 3 c 3 … p m c m N=p_1^{c_1}p_2^{c_2}p_3^{c_3}…p_m^{c_m} N=p1c1p2c2p3c3pmcm

N N N的正约数个数为:

( c 1 + 1 ) ∗ ( c 2 + 1 ) ∗ … ( c m ) + 1 = ∏ i = 1 m ( c i + 1 ) (c_1+1) * (c_2+1) * … (c_m)+1=\prod_{i=1}^m (c_i+1) (c1+1)(c2+1)(cm)+1=i=1m(ci+1)

和为:

∏ i = 1 m ( ∑ k = 0 c i ( p i ) k ) ) = ∏ i = 1 m ( p i c i + 1 − 1 p i − 1 ) \prod_{i=1}^m\left(\sum_{k=0}^{c_i}(p_i)^k)\right)=\prod_{i=1}^m \left (\frac{p_i^{c_i+1}-1}{p_i-1} \right) i=1m(k=0ci(pi)k))=i=1m(pi1pici+11)

2.求 1 ∼ N 1\sim N 1N中每个数的正约数集合:倍数法

vector<int>factor[MAX_N];
for(int i=1;i<=n;i++){
	for(int j=1;j<=n/i;j++){
		factor[i*j].push_back(i);
	}
}

时间复杂度为 Θ ( N log ⁡ N ) \Theta(N\log N) Θ(NlogN)

推论: 1 ∼ N 1\sim N 1N中每个数的约数个数约为$N\log N$1

gcd

定理

∀ a , b ∈ N \forall a,b\in \mathbb{N} a,bN    ,  $\operatorname{lcm}(x,y)=\frac{x \times y}{\gcd(x,y)} $

∀ a , b ∈ N \forall a,b\in \mathbb{N} a,bN   ,  gcd ⁡ ( a , b ) = gcd ⁡ ( b , a   m o d   b ) \gcd(a,b)=\gcd(b,a \bmod b ) gcd(a,b)=gcd(b,amodb)

exgcd:

解决:求: a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)的一组解:

code:

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

欧拉函数 φ \varphi φ

定义: 1 ∼ N 1\sim N 1N中与 N N N互质的数的个数是关于 N N N的欧拉函数,记作 φ ( N ) \varphi(N) φ(N)

求法:

φ ( N ) = ∏ 质数 p ∣ N ( p − 1 p ) \varphi(N)=\prod_{\text{质数}p|N}\left(\frac{p-1}{p}\right) φ(N)=质数pN(pp1)

性质:

1. 1 ∼ n 1\sim n 1n中与 n n n互质的数的和为: n ∗ φ ( n ) 2 n * \frac{\varphi(n)}{2} n2φ(n)

2.若 gcd ⁡ ( a , b ) = 1 \gcd(a,b)=1 gcd(a,b)=1,则 φ ( a b ) = φ ( a ) φ ( b ) \varphi(ab)=\varphi(a)\varphi(b) φ(ab)=φ(a)φ(b)

3.在算术基本定理中 n = ∏ i = 1 m ( p i c i ) n=\prod_{i=1}^m(p_i^{c_i}) n=i=1m(pici),则 φ ( n ) = ∏ k = 1 m φ ( p i c i ) \varphi(n)=\prod_{k=1}^m\varphi({p_i^{c_i}}) φ(n)=k=1mφ(pici), 此性质所有积性函数都具备

4.若 p p p为质数且 p ∣ n , p 2 ∣ n p|n,p^2|n pn,p2n,则 φ ( n ) = φ ( n p ) p \varphi(n)=\varphi(\frac{n}{p})p φ(n)=φ(pn)p

5.若 p p p为质数且 p ∣ n , p 2 ∤ n p|n,p^2\nmid n pn,p2n,则 φ ( n ) = φ ( n p ) ( p − 1 ) \varphi(n)=\varphi(\frac{n}{p})(p-1) φ(n)=φ(pn)(p1)
6. ∑ d ∣ n φ ( d ) = n \sum_{d|n}\varphi(d)=n dnφ(d)=n

欧拉函数的递推求解:

由性质4,5,我们可以在求质数的时候顺带求出欧拉函数

int v[MAX_N],prime[MAX_N],phi[MAX_N];
void euler(int n){  
    memset(v,0,sizeof v);
    int cnt=0;
    for(int i=2;i<=n;i++){  
        if(!v[i]){  
            v[i]=i;
            prime[++cnt]=i;
            phi[i]=i-1;        
        }
        for(int j=1;j<=cnt;j++){  
            if(prime[j]>v[i]||i*prime[j]>n)break;
            v[i*prime[j]]=prime[j];
            phi[i*prime[j]]=phi[i]*(i%prime[j]?prime[j]-1:prime[j]);
        }
    }
}

同余

1.欧拉定理

若正整数a,n互质,则 a φ ( n ) ≡ 1 (   m o d   n ) \text{若正整数a,n互质,则}a^{\varphi(n)}\equiv 1 (\bmod n) 若正整数a,n互质,则aφ(n)1(modn)
推论:

若正整数a,n互质,则 a b ≡ a b   m o d   φ ( n ) (   m o d   n ) \text{若正整数a,n互质,则}a^b \equiv a^{b \bmod \varphi(n)} (\bmod n) 若正整数a,n互质,则ababmodφ(n)(modn)
当a,n不一定互质的时候有(扩展欧拉定理):

a b ≡ a b   m o d   φ ( n ) + φ ( n ) (   m o d   n ) a^b \equiv a^{b \bmod \varphi(n) + \varphi(n)} (\bmod n) ababmodφ(n)+φ(n)(modn)

2.裴蜀定理: 对于任意整数a,b,存在一对整数x,y满足: a x + b y = gcd ⁡ ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b)

int exgcd(int a,int b,int &x,int &y){  
    if(!b){  
        x=0,y=1;
        return a;
    }
    int d=exgcd(b,a%b,x,y);
    int z=x;
    x=y,y=z-(a/b)*y;
    return d;
}

对于更加一般的一次不定方程 a x + b y = c ax+by=c ax+by=c,设 d = gcd ⁡ ( a , b ) d=\gcd(a,b) d=gcd(a,b),它有解当且仅当 d ∣ c d|c dc
我们可以先用 exgcd ⁡ \operatorname{exgcd} exgcd求出方程 a x + b y = d ax+by=d ax+by=d的一组解 x 0 , y 0 x_0,y_0 x0,y0,这样方程 a x + b y = c ax+by=c ax+by=c的解 x = x 0 × c d x=x_0\times\frac{c}{d} x=x0×dc,y同理
由此我们可以设方程 a x + b y = c ax+by=c ax+by=c的一组解为 x 0 , y 0 x_0,y_0 x0,y0,则它的所有整数解为:

x = x 0 + k b d , y = y 0 + k a d , k ∈ Z x=x_0+k\frac{b}{d}, y=y_0+k\frac{a}{d},k\in \mathbb{Z} x=x0+kdb,y=y0+kda,kZ

乘法逆元

定义,设 b d ≡ 1 (   m o d   n ) bd\equiv 1 (\bmod n) bd1(modn),则b为d关于模n的乘法逆元,d为b关于模n的乘法逆元

求法:1.若n是质数,则 d = b n − 2 d=b^{n-2} d=bn2

2.若仅仅是保证b,n互质,则d可通过求解线性同余方程求得

解线性同余方程

对于线性同余方程 a x ≡ b (   m o d   m ) ax\equiv b (\bmod m) axb(modm),可以将其看作 a x + b m = b ax+bm=b ax+bm=b的不定方程来解,这里的 x x x就是线性同余方程的解

中国剩余定理

m 1 , m 2 , m 3 … … … m n m_1,m_2,m_3………m_n m1,m2,m3………mn是两两互质的整数,设 M = ∏ i = 1 n m i , M i = M m i M=\prod_{i=1}^nm_i,M_i=\frac{M}{m_i} M=i=1nmi,Mi=miM,设 t i t_i ti是线性同余方程 M i t i ≡ 1 (   m o d   m i ) M_it_i\equiv 1(\bmod m_i) Miti1(modmi)的一个解
则对于同余方程组:

{ x ≡ a 1 (   m o d   m 1 ) x ≡ a 2 (   m o d   m 2 ) x ≡ a 3 (   m o d   m 3 ) … x ≡ a n (   m o d   m n ) \left\{ \begin{aligned} x& \equiv a_1 (\bmod m_1) \\ x& \equiv a_2 (\bmod m_2) \\ x& \equiv a_3 (\bmod m_3) \\ &… \\ x& \equiv a_n (\bmod m_n) \\ \end{aligned} \right. xxxxa1(modm1)a2(modm2)a3(modm3)an(modmn)
有解,解为:

x = ∑ i = 1 n a i M i t i + k m , k ∈ Z x=\sum_{i=1}^na_iM_it_i + km,k\in \mathbb{Z} x=i=1naiMiti+km,kZ

扩展中国剩余定理(excrt)

特别的,当 m 1 ∼ m n m_1\sim m_n m1mn并不两两互质的时候
假设我们已经求出了前 k − 1 k-1 k1个方程的通解,记 m = lcm ⁡ ( m 1 ∼ m k − 1 ) m=\operatorname{lcm}(m_1\sim m_{k-1}) m=lcm(m1mk1),则 x + i m , i ∈ Z x+im ,i\in \mathbb{Z} x+im,iZ是方程的通解,此时我们需要求出一个 t t t使得 x + t m ≡ a k (   m o d   m k ) x+tm\equiv a_k(\bmod m_k) x+tmak(modmk),此时 x + t m x+tm x+tm就是前k个方程的解,所以其实我们可以将excrt理解为n次exgcd

高次同余方程: a x ≡ b (   m o d   p ) a^x\equiv b (\bmod p) axb(modp)

拔山盖世(大步小步:Baby Step,Giant Step)算法

前提:a,p互质

因为a,p互质,所以可以在模p的意义下进行关于a的乘除运算
x = i × t − j , t = ⌊ p ⌋ , i ∈ [ 0 , t ] , j ∈ [ 0 , t − 1 ] x=i\times t-j,t=\lfloor \sqrt p \rfloor,i\in [0,t],j\in [0,t-1] x=i×tj,t=p ,i[0,t],j[0,t1]
则方程式子可变为: ( a t ) i ≡ a j × b (   m o d   p ) (a^t)^i\equiv a^j\times b (\bmod p) (at)iaj×b(modp),此时枚举 j j j的取值,将 a j × b a_j\times b aj×b插入一个 Hash ⁡ \operatorname{Hash} Hash表中,然后再枚举 i i i在表中查找即可

int BSGS(int a,int b,int p){
	int t=sqrt(p)+1;b%=p,a%=p;
	map<int,int>hash;hash.clear();
	for(int i=0;i<t;i++){
		hash[power(a,i,p)*b%p]=i;
	}
	a=power(a,t,p);
	if(!a)return b==0?1:-1; 
	for(int i=0;i<=t;i++){
		int m=power(a,i,p);
		int j=hash.find(m)==hash.end()?-1:hash[m];
		if(j>=0&&i*t-j>=0){
			return i*t-j;
		}
	}
	return -1;
} 

exBSGS

C o d e Code Code
:

int gcd(int a,int b){return !b?a:gcd(b,a%b);}
int exgcd(int a,int b,int &x,int &y)
{
	if(!b)
	{
		x=1,y=0;
		return a;
	}
	int gcd=exgcd(b,a%b,y,x);
	y-=(a/b)*x;
	return gcd;
}
inline int exBSGS(int a,int b,int mod)
{
	b%=mod;
	if(b==1||mod==1)	return 0;
	int g=0,val=1;
	while(true)
	{
		int d=gcd(a,mod);
		if(d==1)	break;
		if(b%d)	return -1;
		b/=d,mod/=d,val=val*a/d%mod;
		g++;
		if(b==val)	return g;
	}
	int x,y;
	exgcd(val,mod,x,y);
	x=(x%mod+mod)%mod;
	b=b*x%mod,a%=mod;
	map<int,int>mp;
	int t=ceil(sqrt(mod));
	int z=1;
	for(int i=0;i<t;i++)
		mp[b*z%mod]=i,z=z*a%mod;
	int p=1;
	for(int i=1;i<=t;i++)
	{
		p=p*z%mod;
		if(mp.count(p))	return i*t-mp[p]+g;
	}
	return -1;
}
signed main()
{
	a=read(),p=read(),b=read();
	while(a||b||p)
	{
		int ans=exBSGS(a,b,p);
		if(ans==-1)	puts("No Solution");
		else	printf("%lld\n",ans);
		a=read(),p=read(),b=read();
	}
	return 0;
}

矩阵乘法

定义,设A是 m × n m\times n m×n矩阵,B是 n × p n \times p n×p矩阵,则 C = A × B C=A\times B C=A×B是一个 m × p m\times p m×p矩阵

性质:
A × B A\times B A×B不一定等于 B × A B\times A B×A,

( A × B ) × C = A × ( B × C ) (A\times B) \times C=A\times (B\times C) (A×B)×C=A×(B×C),

( A + B ) × C = A × C + B × C (A+B) \times C=A\times C+B\times C (A+B)×C=A×C+B×C

定义,设 C = A × B C=A\times B C=A×B,A是 m × n m\times n m×n矩阵,B是 n × p n \times p n×p矩阵,

C i , j = ∑ 1 ≤ k ≤ n ( A i , k ∗ B k , j ) ,其中 ( 1 ≤ i ≤ m , 1 ≤ j ≤ p ) C_{i,j}=\sum_{1\le k\le n}\left(A_{i,k}*B_{k,j}\right)\text{,其中}(1\le i \le m,1\le j \le p) Ci,j=1kn(Ai,kBk,j),其中(1im,1jp)

for(int i=1;i<=m;i++)
    for(int j=1;j<=p;j++)
        for(int k=1;k<=n;k++)
            c[i][j]+=a[i][k]*b[k][j];

考虑一种特殊情形,矩阵 F × Q F\times Q F×Q,其中Q是 n × n n\times n n×n矩阵,F是 1 × n 1\times n 1×n矩阵
若是设 F ′ = F × Q F'=F\times Q F=F×Q,则 F ′ [ i ] = ∑ k = 1 n F [ k ] × Q [ k ] [ i ] F'[i]=\sum_{k=1}^nF[k]\times Q[k][i] F[i]=

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值