📅  最后修改于: 2023-12-03 15:06:09.574000             🧑  作者: Mango
这个主题涉及到了的一些算法和技巧,包括但不限于质数筛、质因数分解和数学思维等方面,对于程序员来说是一个很有挑战性和收获的话题。
质数筛是一种快速且常用的找出所有质数的方法,常见的有欧拉筛、埃氏筛和线性筛等算法。
埃氏筛是一种最基础、最简单的质数筛法,思路简单易懂。
int prime[SIZE], cnt;
bool vis[SIZE];
void eratosthenes(int n){
for(int i = 2; i <= n; i++){
if(!vis[i]){
prime[cnt++] = i;
for(int j = i * i; j <= n; j += i){
vis[j] = true;
}
}
}
}
欧拉筛是一种高效的质数筛法,采用了线性筛改进的思路,能够在时间复杂度 $O(n)$ 的情况下找出小于等于 $n$ 的所有质数。
int prime[SIZE], cnt;
bool vis[SIZE];
void euler(int n){
for(int i = 2; i <= n; i++){
if(!vis[i]){
prime[cnt++] = i;
}
for(int j = 0; j < cnt && i * prime[j] <= n; j++){
vis[i * prime[j]] = true;
if(i % prime[j] == 0) break;
}
}
}
质因数分解是将一个正整数分解为若干个质数的乘积的过程,是数论中的一种基本算法,能够在数据处理、密码学等领域广泛应用。以下是 C++ 中的代码实现。
vector<int> prime_factor(int n){
vector<int> res;
for(int i = 2; i * i <= n; i++){
while(n % i == 0){
res.push_back(i);
n /= i;
}
}
if(n != 1) res.push_back(n);
return res;
}
对于大多数数论问题,数学思维是必不可少的一部分。我们需要从数学上理解问题的本质、特征和规律,从而得出正确的结论。
例如,对于求一个数除以另一个数的最高幂的问题,可以根据质因数分解的思想来解决。我们首先对这两个数进行质因数分解,得到它们的质因数分解式 $a=p_1^{a_1}p_2^{a_2}...p_k^{a_k}$ 和 $b=p_1^{b_1}p_2^{b_2}...p_k^{b_k}$,其中 $p_i$ 是第 $i$ 个质数,$a_i$、$b_i$ 分别表示 $a$、$b$ 中第 $i$ 个质数的幂次。那么,$a$ 除以 $b$ 的最高幂即为 $min(a_1-b_1, a_2-b_2, ..., a_k-b_k)$。
代码实现如下:
int max_divide(int a, int b){
int res = INT_MAX;
for(int i = 2; i * i <= b; i++){
if(b % i == 0){
int cnt = 0;
while(b % i == 0){
cnt++;
b /= i;
}
int t = a, p = 0;
while(t >= i){
p += t / i;
t /= i;
}
if(p / cnt < res) res = p / cnt;
}
}
if(b > 1){
int t = a, p = 0;
while(t >= b){
p += t / b;
t /= b;
}
if(p < res) res = p;
}
return res;
}
至此,我们已经完成了一个数除以其他数的最高幂问题的算法实现。