最大公约数
int gcd(int a, int b){
if(b == 0) return a;
return gcd(b, a%b);
}
最小公倍数
int lcm(int a, int b){
return a/gcd(a, b)*b;
}
判断素数
时间复杂度 O ( s q r t ( n ) / 3 ) O(sqrt(n)/3) O(sqrt(n)/3)
根据质数分布规律:大于等于5的质数一定是和6的倍数相邻。
bool check(int x) {
if(x == 2|| x == 3 ||x == 5) return true;
if(x <= 5) return false;
if(x%6 != 1 && x%6 != 5) return false;
for(int i = 5; i*i <= x; i += 6){
if(x % i == 0 || x % (i+2)==0) return false;
}
return true;
}
Eratosthenes素数筛法
int primes[N];
bool p[N] = {
0};
int k = 0;
void get_primes(){
for(int i = 2; i < N; i++){
if(!p[i]){
primes[k++] = i;
for(int j = i+i; j < N; j += i){
p[j] = 1;
}
}
}
}
线性筛素数
时间复杂度 O ( n ) O(n) O(n)
void get_primes(int n){
for(int i = 2; i <= n; i++){
if(!st[i]) {
primes[k++] = i;
}
for(int j = 0; primes[j] <= n/i; j++){
st[primes[j]*i] = true;
if(i % primes[j] == 0) break;//primes[j]是i的最小质因子
}
}
}
并查集
时间复杂度几乎 O ( 1 ) O(1)