#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int Maxn = 1e8 + 7;
const int Inf = 1e9 + 7;
int N , M;
int vis[Maxn] , prime[Maxn];
int main()
{
//素数筛选两种方式
//普通筛选素数 Maxn = 1e8 时,复杂度 (n/2) * 5e7 约等于 5 * 1e15
memset( vis , 0 , sizeof(vis) );
for( int i = 2 ; i <= Maxn/2 ; i++ ){
if( vis[i] != 1 )
for( int j = 1 ; j * i <= Maxn ; j++ ){
vis[i*j] = 1;
}
}
//另一种 Maxn = 1e8 时,复杂度 n * 1e3
memset( vis , 0 , sizeof(vis) );
int tmp = 0;
for( int i = 2 ; i <= Maxn ; i++ ){
if( !vis[i] ){
prime[++tmp] = i;
}
for( int j = 1 ; j <= tmp && i * prime[j] <= Maxn ; j++ ){
vis[i*prime[j]] = 1;
}
}
}
个人觉得第二种筛选素数更好
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int Maxn = 1e8 + 7;
const int Inf = 1e9 + 7;
int N , M;
int main()
{
//分解质因数
for( int i = 2 ; i <= sqrt(N) ; i++ ){
if( N % i == 0 ){
while( N % i == 0 ){
N /= i;
}
}
}
}
分解质因数sqrt(N) 的方式
质因数的作用极其广泛,对于数字还是不够敏感