线性筛
int prim[N];
int nu=0;
bool st[N];
void init(int n){
for(int i=2;i<=n;i++){
if(!st[i]) prim[nu++]=i;
for(int j=0;prim[j]*i<=n;j++){
st[prim[j]*i]=1;
if(i%prim[j]==0) break;
}
}
}
欧拉函数(求逆元(在模数不为质数时用)求1-n内所有数的欧拉函数)
int prim[N];
int nu=0;
bool st[N];
int cont[N];
void init(int n){
cont[1]=1;
for(int i=2;i<=n;i++){
if(!st[i]){
prim[nu++]=i;
ans[i]=i-1;
}
for(int j=0;prim[j]*i<=n;j++){
st[prim[j]*i]=1;
if(i%prim[j]==0){
cont[i*prim[j]]=cont[i]*prim[j];
break;
}
cont[i*prim[j]]=cont[i]*(prim[j]-1);
}
}
}
莫比乌斯函数(求1-n内所有数的莫比乌斯函数,n不超过1e7)
int nu=0;
int prim[N];
bool st[N];
int mobius[N]{};
int sum[N];
void init(int n){
mobius[1]=1;
for(int i=2;i<=n;i++){
if(!st[i]){
prim[nu++]=i;
mobius[i]=-1;
}
for(int j=0;i*prim[j]<=n;j++){
st[i*prim[j]]=1;
if(i%prim[j]==0){
mobius[i*prim[j]]=0;
break;
}
mobius[prim[j]*i]=mobius[i]*-1;
}
}
for(int i=1;i<=n;i++) sum[i]=sum[i-1]+mobius[i]; //求mobius函数前缀和
}
欧几里得(gcd)
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
扩展欧几里得(exgcd)
int exgcd(int a,int b,int &x,int &y){
if(!b){
x=1;
y=1;
return a;
}
int d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}