小魔现主义(0)
Spouter_27 · · 个人记录
小魔现主义 洛谷篇(编号为非正)
正篇发表于 bilibili 账号 SPST清屿市第一中学。
线性筛约数个数
- 求一个数约数个数:
根据算数基本定理,一个数
的形式,其中
证明很好证,考虑任何一个
- 线性筛最小质因数个数:
设
注意
先放代码:
typedef long long ll;
ll num[N],prime[N],cnt=0;
bool vis[N];
void initd(ll n){
for(int i=2;i<=n;i++){
if(!vis[i]){
prime[++cnt]=i;
num[i]=1;
}
for(int j=1;j<=cnt;j++){
if(i*prime[j]<=n){
vis[i*prime[j]]=1;
if(i%prime[j]==0){
num[i*prime[j]]=num[i]+1;
break;
}
num[i*prime[j]]=1;
}
else{
break;
}
}
}
}
说明之前未被扫过,
由于
此时
假设
- 约数个数线性筛:
特判:
typedef long long ll;
ll d[N],num[N],prime[N],cnt=0;
bool vis[N];
void initd(ll n){
d[1]=1;
for(int i=2;i<=n;i++){
if(!vis[i]){
prime[++cnt]=i;
num[i]=1;
d[i]=2;
}
for(int j=1;j<=cnt;j++){
if(i*prime[j]<=n){
vis[i*prime[j]]=1;
if(i%prime[j]==0){
num[i*prime[j]]=num[i]+1;
d[i*prime[j]]=d[i]/(num[i]+1)*(num[i]+2);
break;
}
d[i*prime[j]]=d[i]*2;
num[i*prime[j]]=1;
}
else{
break;
}
}
}
}
就是在线性筛最小质因数个数的基础上添加了求
说明i为质数,含有两个因数1和i。