标签:
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