标签:
O(n) 筛选素数
#include<bits/stdc++.h>
using namespace std;
const int M = 1e6 + 10 ;
int mindiv[M] ;//每个数的最小质因数
int prim[M] , pnum ;//存素数
bool vis[M] ;
void prim () {
for (int i = 2 ; i < M ; i ++) {
if (!vis[i]) {
mindiv[i] = i ;
prim[ pnum++ ] = i ;
}
for (int j = 0 ; j < pnum ; j ++) {
if ( i*prim[j] >= M ) break ;
vis[ i*prim[j] ] = 1 ;
mindiv[i] = prim[j] ;
if (i % prim[j] == 0) break ;
}
}
}
int main () {
prim () ;
return 0 ;
}
欧拉函数O(n) :phi[i] 为<= i 的范围内与i互质的数的数量
#include<bits/stdc++.h>
using namespace std;
const int M = 1e6 + 10 ;
int mindiv[M] ;
int prim[M] , pnum ;
bool vis[M] ;
int phi[M] ; //欧拉函数
int Euler () {
phi[1] = 1 ;
for (int i = 2 ; i < M ; i ++) {
if (vis[i] && phi[i] == 0) { phi[i] = pnum ; }
if (!vis[i]) {
prim[ pnum++ ] = i ;
phi[i] = i-1 ;
mindiv [i] = i ;
}
for (int j = 0 ; j < pnum ; j ++) {
if (i * prim[j] >= M) break ;
vis[ i*prim[j] ] = 1 ;
mindiv [ i*prim[j] ] = prim[j] ;
if (i % prim[j] == 0) break ;
else phi[ i*prim[j] ] = phi[i] * phi[prim[j]] ;
}
}
}
int main () {
Euler () ;
return 0 ;
}
标签:
原文地址:http://www.cnblogs.com/get-an-AC-everyday/p/4747832.html