数论:欧拉函数

#include<cstdio>
#include<stack>
#include<iostream>
#include<queue>
#include<algorithm>
#include<iterator>
#include<set>
#include<string>
#include<cstring> 
#include<map>
#include<vector>
using namespace std;
int n,q,check[100000001]={
    
    0};
int prime[1000001],cnt=0;
int phi[100000001];
void el(){
    
    //欧拉筛求欧拉函数
	check[1]=1;
    for(int i=2;i<=100000001;i++){
    
    
        if(!check[i]) prime[cnt++]=i,phi[i]=i-1;
        for(int j=0;j<cnt && i*prime[j]<100000001;j++){
    
    
            check[i*prime[j]]=1;
            if(i%prime[j]){
    
    
            	phi[i*prime[j]]=phi[i]*(prime[j]-1);
            }
            else{
    
    
            	phi[i*prime[j]]=phi[i]*prime[j];
			}
        }
    }
}
int main(){
    
    
	el();
	for(int i=2;i<=20;++i){
    
    
		printf("phi[%d]=%d\n",i,phi[i]);
	}
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45695839/article/details/109555976