没做到过要用这玩意儿的。。。
线筛约数和
约数和的定义
定义如它的名字所示,表达式如下:
约数和的性质
根据算术基本定理,计算约数和有个公式,设x=pa11pa22...pannx=p1a1p2a2...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的最小质因子,所以有;
综上:
代码
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];
}
}
357



被折叠的 条评论
为什么被折叠?



