清北學堂noip2018集訓D3
阿新 • • 發佈:2018-12-13
高精度演算法
- 大數的儲存
- 高精度加法
- 高精度乘法
快速冪
進位制轉換
素數
- 大於一且因數只有1和它本身。
- 算數基本定理
- 任何一個大於1的自然數 N,如果N不為質數,那麼N可以唯一分解成有限個質數的乘積,這裡均為質數,其中指數是正整數。
- 判斷一個數是不是素數
- 一般演算法
#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; }
- 演算法
#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<
gcd/lcm
- gcd:最大公約數
- lcm:最小公倍數
gcd
- 怎麼算?
- 輾轉相減
- 輾轉相除法
- 程式碼如下:
int gcd(int a,int b){ if(b==0) return a; return gcd(b,a%b); }
lcm
- 程式碼如下:
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;
}