欧拉线性筛 与 欧拉函数 + 几道例题

欧拉线性筛

生成素数表prime[]数组

const int maxn = 1e7+5;
int prime[maxn];
int visit[maxn];
void Prime(){
    memset(visit,0,sizeof(visit));
    memset(prime, 0,sizeof(prime));
    for (int i = 2;i <= maxn; i++) {
        if (!visit[i]) {
            prime[++prime[0]] = i; 
        }
        for (int j = 1; j <=prime[0] && i*prime[j] <= maxn; j++) {
            visit[i*prime[j]] = 1;
            if (i % prime[j] == 0) {
                break;
            }
        }
    }
}

欧拉函数

欧拉函数:与n互质的数(<n)个数

欧拉线性筛求欧拉函数

const int maxn = 1e7+5;
int prime[maxn]; //素数表
int phi[maxn]; // phi[]数组就是1~maxn的欧拉函数值 
int visit[maxn];

//欧拉线性筛 求 欧拉函数
void init(){
	for(int i=2;i<=maxn;i++){
	    if(!visit[i]){
	        prime[++cnt]=i;
	        phi[i]=i-1;//质数直接能求出
	    }
	    for(int j=1;j<=cnt&&prime[j]*i<=maxn;j++){
	        visit[i*prime[j]] = 1;
	        if(i%prime[j]==0){
	            phi[i*prime[j]]=phi[i]*prime[j];//px不互质
	            break;
	        }
	        else phi[i*prime[j]]=phi[i]*(prime[j]-1);//px互质
	    }
	}
} 

例题一:蓝桥杯2018年决赛-矩阵求和

思路:欧拉线性筛求欧拉函数 点击这里查看详解

例题二:2018年南京网络赛-sum

做题地址:https://nanti.jisuanke.com/t/A1956
题解地址1:https://blog.csdn.net/baiyifeifei/article/details/82290007
题解地址2:https://blog.csdn.net/qq_37451344/article/details/82290901

本文参考至:
https://blog.csdn.net/qq_39763472/article/details/82428602
https://blog.csdn.net/bojack_/article/details/78313778

posted @ 2019-05-17 16:47  fishers  阅读(348)  评论(0编辑  收藏  举报