码迷,mamicode.com
首页 > 其他好文 > 详细

素数的线性筛 && 欧拉函数

时间:2015-08-21 15:24:29      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!