1. 程式人生 > >清北學堂noip2018集訓D3

清北學堂noip2018集訓D3

高精度演算法

  • 大數的儲存
  • 高精度加法
  • 高精度乘法

快速冪

進位制轉換

素數

  • 大於一且因數只有1和它本身。
  • 算數基本定理
    • 任何一個大於1的自然數 N,如果N不為質數,那麼N可以唯一分解成有限個質數的乘積N=P1a1×P2a2×P3a3×......×PnanN=P_1^{a_1}\times P_2^{a_2}\times P_3^{a_3}\times ......\times P_n^{a_n},這裡P1<P2<P3......<PnP_1<P_2<P_3......<P_n
      均為質數,其中指數aia_i是正整數。
  • 判斷一個數是不是素數
  • 一般演算法
    #include<bits/stdc++.h>
    using namespace std;
    bool is_prime(int x){
    	for(int i=2;i*i<=x;i++){
    		if(x%i==0) return 0;
    	}
    	return 1;
    }
    int main(){
    	int n;
    	cin>>n;
    	cout<<is_prime(i);
    	return 0;
    }
    
  • O(nloglogn)O(nloglogn)
    演算法
    #include<bits/stdc++.h>
    using namespace std;
    bool a[100000005];
    int x[100000005];
    int find_prime(int n){
    	int tot=0;
    	for(int i=2;i<=n;i++){
    		if(!a[i]){
    			x[tot++]=i;
    			for(int j=2;j*i<=n;j++){
    				a[j*i]=1;
    			}
    		}
    	}
    	return tot;
    }
    int main(){
    	int len=find_prime(100000);
    	for(int i=0;i<
    len;i++){ cout<<x[i]<<" "; } return 0; }

gcd/lcm

  • gcd:最大公約數
  • lcm:最小公倍數
  • (a,b)[a,b]=ab(a,b)[a,b]=ab

gcd

  • gcd(a,b)=p1min(a1,b1)×p2min(a2,b2)×...×pnmin(an,bn)gcd(a,b)=p_1^{min(a_1,b_1)}\times p_2^{min(a_2,b_2)}\times ...\times p_n^{min(a_n,b_n)}
  • 怎麼算?
  • 輾轉相減 gcd(a,b)=gcd(b,ab)gcd(a,b) = gcd(b,a-b)
  • 輾轉相除法 gcd(a,b)=gcd(b,a%b)gcd(a,b) = gcd(b,a\%b)
  • 程式碼如下:
    int gcd(int a,int b){
    	if(b==0) return a;
    	return gcd(b,a%b);
    }
    

lcm

  • lcm(a,b)=p1max(a1,b1)×p2max(a2,b2)×...×pnmax(an,bn)lcm(a,b)=p_1^{max(a_1,b_1)}\times p_2^{max(a_2,b_2)}\times ...\times p_n^{max(a_n,b_n)}
  • 程式碼如下:
    int lcm(int a,int b){
    	return a*b/gcd(a,b);
    }
    

示例程式碼

#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b){
	if(b==0) return a;
	return gcd(b,a%b);
}
int lcm(int a,int b){
	return a*b/gcd(a,b);
}
int main(){
	cout<<gcd(3,4)<<endl;
	cout<<lcm(3,4);
	return 0;
} 

裴蜀定理

  • gcd(a,b)=dax+by=dgcd(a,b)=d\Rightarrow ax+by=d
  • gcd(a,b)=1ax+by=1gcd(a,b)=1\Leftarrow\Rightarrow ax+by=1

擴充套件歐幾里得演算法