数论
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);
}
}
}