数论

0、目录

逆元、筛法

1、逆元

1.1、打表预处理:

inv[i]=(MOD-MOD/i)*inv[MOD%i]%MOD;

转自:http://blog.csdn.net/whyorwhnt/article/details/19169035

2、筛法

2.1、筛法求素数:

const int maxn=1e7+10;
const int maxp=7e5;

int vis[maxn];
int prime[maxp];

void sieve(int n){
	int m=(int)sqrt(n+0.5);
	memset(vis,0,sizeof(vis));
	for(int i=2;i<=m;i++) if(!vis[i]){
		for(int j=i*i;j<=n;j+=i) vis[j]=1;
	} 
} 

int gen_primes(int n){
	sieve(n);
	int tot=0;
	for(int i=2;i<=n;i++) if(!vis[i]){
		prime[tot++]=i;
	}
	return tot;
}

2.2、筛法求欧拉phi函数值:

//求phi(n);
int euler_phi(int n){
    int m=(int)sqrt(n+0.5);
    int ans=n;
    for(int i=2;i<=m;i++) if(n%i==0){
        ans=ans/i*(i-1);
        while(n%i==0) n/=i;
    }
    if(n>1) ans=ans/n*(n-1);
    return ans;
}

//求phi[x],x=1,...,n
void phi_table(int n,int* phi){
    for(int i=2;i<=n;i++) phi[i]=0;
    phi[1]=1;
    for(int i=2;i<=n;i++) if(!phi[i]){
        for(int j=i;j<=n;j+=i){
            if(!phi[j]) phi[j]=j;
            phi[j]=phi[j]/i*(i-1);
        }
    }
}
原文地址:https://www.cnblogs.com/fenice/p/5754507.html