没做到过要用这玩意儿的。。。
线筛约数和
约数和的定义
定义如它的名字所示,表达式如下:
σ1(x)=∑d|xdσ1(x)=∑d|xd
约数和的性质
根据算术基本定理,计算约数和有个公式,设x=pa11pa22...pannx=p1a1p2a2...pnan,那么有:
σ1(x)=(1+p1+p21+...+pa11)(1+p2+p22+...+pa22)...(1+pn+p2n+...+pann)σ1(x)=(1+p1+p12+...+p1a1)(1+p2+p22+...+p2a2)...(1+pn+pn2+...+pnan)
积性也很好证,两个互质的数拥有两个不同的质因数集合,根据上面的公式,显然是可以直接乘起来的。
其他的性质因为没用过,也不太了解。。。
约数和的线筛
按照惯例,设T=i×p[j]T=i×p[j]。
根据线筛σ0(x)σ0(x)的套路,我们也开一个数组prod[i]prod[i]表示以11为首项,的最小质因数为公比,项数为ii的最小质因数的指数的等比数列的和。
1.当为素数时,TT的因数只有和它本身,所以σ1(T)=prod[i]=T+1σ1(T)=prod[i]=T+1;
2.当TT拥有多个最小质因子(即)时,因为p[j]p[j]为ii的最小质因子,那么与ii相比,就是在这个等比数列里比ii多了一个,所以有:prod[T]=prod[i]×p[j]+1,σ1(T)=σ1(i)×prod[T]prod[i]prod[T]=prod[i]×p[j]+1,σ1(T)=σ1(i)×prod[T]prod[i];
3.当TT的最小质因子都只有一个(即)时,p[j]p[j]为TT的最小质因子,所以有;
综上:
σ1(T)=⎧⎩⎨⎪⎪⎪⎪T+1σ1(i)×prod[T]prod[i]σ1(T)=σ(i)×(p[j]+1)T∈Primei mod p[j]=0i mod p[j]≠0σ1(T)={T+1T∈Primeσ1(i)×prod[T]prod[i]i mod p[j]=0σ1(T)=σ(i)×(p[j]+1)i mod p[j]≠0
代码
void get()
{
R i,j,t;
check[1]=prod[1]=sumd[1]=1;
for(i=2;i<=N;++i)
{
if(!check[i])prod[i]=sumd[i]=1+i,p[++p[0]]=i;
for(j=1;j<=p[0];++j)
{
t=i*p[j];if(t>N)break;
check[t]=1;
if(i%p[j]==0){prod[t]=prod[i]*p[j]+1;sumd[t]=sumd[i]/prod[i]*prod[t];break;}
prod[t]=p[j]+1,sumd[t]=sumd[i]*(p[j]+1);
}
sumd[i]+=sumd[i-1];
}
}