1. 程式人生 > >NOIp數學

NOIp數學

NOIp 數學基礎

目錄

  • 素數判斷
  • gcd/exgcd
  • 逆元
  • crt(中國剩餘定理)
  • 線性代數
    -快速冪
    • 矩陣相關
    • 高斯消元
  • 組合數學
    • 卡特蘭數
    • 排列組合
    • Lucas定理
    • 二項式定理
    • 康託展開
    • 容斥原理
  • 進位制相關
  • 高精度運算

一、素數判斷

1、樸素的埃氏篩法

bool isp[MAXN];
int p[MAXN],tot;
void Prime(){
	for(int i=0;i<=n;i++)
	    isp[i]=1;
	isp[0]=isp[1]=0;
	for(int i=2;i<=n;i++){
		if(isp[i])
			p[++tot]=i;
		for(int j=i*2;j<=n;j+=i)
		    isp[j]=0;
	}
}

可以發現一個合數被判斷的次數非常多,所以有如下優化:

2、尤拉篩(線性篩素數)

bool notp[MAXN];
int p[MAXN],tot;
void Prime(){
	memset(notp,0,sizeof notp);
	notp[0]=notp[1]=1;
	for(int i=2;i<=n;i++){
		if(!notp[i])
			p[++tot]=i;
		for(int j=1;j<=tot;j++){
			if(p[j]*i>n)break;
			notp[p[j]*i]=1;
			if(i%p[j]==0)break;
		}
	}
}

保證了每個合數只被它最小的質因數篩去,提高了時間效率。

二、gcd、exgcd

1、 g c d gcd

g c d

( a , b ) gcd(a,b) 表示 a a b b 的最大公因數

l c m ( a , b ) lcm(a,b) 表示 a a b b 的最小公倍數

性質

g c d ( a , b ) = g c d ( a b , b ) = g c d ( a % b , b ) gcd(a,b)=gcd(a-b,b)=gcd(a\%b,b)

證明:設 a &gt; b a&gt;b

g c d ( a b , b ) = g gcd(a-b,b)=g

g a b , g b ∴g|a-b,g|b

a = a + ( a b ) ∵a=a+(a-b)

g a ∴g|a

g g c d ( a , b ) ∴g|gcd(a,b)

g c d ( a b , b ) g c d ( a , b ) ∴gcd(a-b,b)|gcd(a,b)

同理可證, g c d ( a , b ) g c d ( a b , b ) gcd(a,b)|gcd(a-b,b)

g c d ( a , b ) = g c d ( a b , b ) ∴gcd(a,b)=gcd(a-b,b)

`倒推可知, g c d ( a , 0 ) = g c d ( a , a ) = a gcd(a,0)=gcd(a,a)=a

g c d ( a , b ) × l c m ( a , b ) = a × b gcd(a,b)×lcm(a,b)=a×b

證明:設 g = g c d ( a , b ) a = k 1 g , b = k 2 g g=gcd(a,b),a=k1 * g , b=k2 * g

l c m ( a , b ) = l c m ( k 1 × g , k 2 × g ) lcm(a,b)=lcm(k1×g,k2×g)
= g l c m ( k 1 , k 2 ) = g × k 1 × k 2 =g * lcm(k1,k2)=g×k1×k2

g c d ( a , b ) × l c m ( a , b ) = g × g × k 1 × k 2 gcd(a,b)×lcm(a,b)=g×g×k1×k2
= ( g × k 1 ) × ( g × k 2 ) = a × b =(g×k1)×(g×k2)=a×b

性質②也可通過唯一分解定理證明。

int Gcd(int a, int b){
	return b==0?a:gcd(b,a%b);
}
int Lcm(int a, int b){
	return(int)((long long)a*b/gcd(a,b));
}

2. e x g c d exgcd

引理:貝祖定理(裴蜀定理)

對於任意整數 a b a,b 和它們的最大公約數 d d ,關於 x y x,y 的方程 a x + b y = m ax+by=m 當且僅當 m m d d 的倍數時有整數解

證明(來自這位dalao):

b = 0 b=0 時, g c d a b = a gcd(a,b)=a ,顯然存在一對整數解 x = 1 y = 0 x=1,y=0

b = 0 b!=0

a x 1 + b y 1 = g c d ( a , b ) = g c d ( b , a   m o d   b ) = b x 2 + ( a   m o d   b ) y 2 ax_1+by_1=gcd(a,b)=gcd(b,a \ mod \ b )=bx_2+(a \ mod \ b)y_2