线性筛 [约数个数/约数和]

假如手工操作推。 用一次的筛筛约数总计和约数和,写视频博客并记载下落。。但互联网网络上的许多理应鞭策它。。

粉底算术的根本定理,敝可以发生,每个无符号整数大于或相等的数量2。,可以辩解成这种同次多项式。。

,在家 p 为素数。

一次的筛执意无论何时被最小素分水设备给筛出。

一次的预备器 (筛素数) [我私人的更频繁地应用它]

const int N=1e5+5;
bool 表现[ n]
int 老生常谈[成语]
int cnt;
void initial()
{
    cnt=0;
    for (int) i=2 ; i

这是敝最经用的一次的筛。,自然,敝也将用于预备欧拉应变量和M到处斯应变量。,由于可积应变量根本上可以用一次的S来预备。。

这时缺少写。。T_T 每私人的都理应预备它。

约数总计

算术根本定理,粉底被撞碎素数分水设备的样品。,敝可以找到全部。 N 的约数的总计。


粉底这事态度,敝可以用一次的屏幕筛出电流。 N 的约数总计。

筛分法,敝必要保养最小素数的数量。。

下面是作证。

d(i) 表现 i 的约数总计  

NUM[I] 表现 i 最小素数的总计

普里姆[我] 表现 第 i 个素数

① 一般数是素数。

这对敝来说易于解决开腰槽。,一般的 d(N) = (1+1) = 2

由于素数可是一体素分水设备。(即它本身),变址是 1 。

最小素数分水设备数。
num [ n] = 1

② i%普里姆[ J ] !=0

这种情况,敝可以发生 i 居中,不谢收录 普里姆[ J ] 主要因素,但是,i*普里姆[ J ] 中, 收录一体 普里姆[ J ]

敝可以从火线开腰槽它。 i 的拿约数总计   

话说回来把它包装。 现时更多 素分水设备 普里姆[ J ] 的总计

因而惟一剩下的 d(i*普里姆[ J ]) = d(i)*d(普里姆[ J ])

由于 一般的 普里姆[ J ]  一定是 i*普里姆[ J ] 最小素数分水设备 (由于小到大详表啊)!), 敝必要记载最小素数的总计。

因而保养每一总计字。 num[i*普里姆[ J ]] = 1

③ i%普里姆[ J ]==0

这种情况, i 它应该至多收录 1 个 普里姆[ J ] ,而且 普里姆[ J ] 也终归是 i 最小素数分水设备,由于每个详表都是从素数的详表开端的。。

而 i*普里姆[ J ] 比起 i 有很一体主要因素。,即 

这么 i*普里姆[ J ] 的约数总计 理应是 

后来的,敝快要用到敝先发制人记载下最小素数分水设备总计了,由于敝可以发生。 i 最小素数分水设备总计 为 NUM[I] ,而 d(i) 中 早已包罗在内。

此刻敝 敝可以停止进行第一体又。话说回来乘以   ,你可以开腰槽它。 d(i*普里姆[ J ]) 的约数总计了。

d(i*普里姆[ J ]) = d(i) / (NUM[I]+1) * (NUM[I]+2)

一般 num[i*普里姆[ J ]] = NUM[I]+1 ,持续保养最小素数的数量。。

粉底这样地,敝可以用一次的筛列出。 1 到 N 的数的约数总计。

const int N=1e5+5;
bool 表现[ n]
int 老生常谈[成语],d[N],num [ n];
int cnt;
void initial()
{
    cnt=0;
    d[1]=1;
    for (int) i=2 ; i

约数和

[实则作证跟约数总计根本俱,正确的当然啦特色便了。

算术根本定理,条件询问N的约数的和,你可以用这事态度。。


异样,敝俱你可以用这事态度。去筛出一般 N 的约数和。

筛分法,敝必要保养最小素数的和。,即

下面是作证。

SD(I) 表现 i 的约数和

SP[Ⅰ] 表现 i 最小素数分水设备的等比级数的和 我不发生该怎样描写。,下面提到的。

普里姆[我] 表现第 i 个素数

一般数是素数。。

敝可以易于解决地开腰槽这种情况。,一般的
SD(n) = 1+i

由于素数可是一体素分水设备。,也执意说,可是一体结成。,至高的样品是 1 。

而这事又 Sp[n] = 1+i

② i%普里姆[ J ] !=0

这种情况,敝可以发生 i 居中,不谢收录 普里姆[ J ] 主要因素,但是,i*普里姆[ J ] 中, 收录一体 普里姆[ J ]

敝有火线。 i 的约数和了,不包罗 (1+普里姆[ J ]) 这任一,而 i*普里姆[ J ] 的约数和正确的多了这任一。

i 的约数和是

这么 i*普里姆[ J ] 终极结出果实理应是


sd(i*普里姆[ J ]) = SD(I) * sd(普里姆[ J ])

而 普里姆[ J ] 是 i*普里姆[ J ] 最小素数分水设备 (由于小到大详表啊)! [第二次],这样sp[i*普里姆[ J ]] = 1+普里姆[ J ] 

③ i%普里姆[ J ]==0

这种情况, i 它应该至多收录 1 个 普里姆[ J ] ,而且 普里姆[ J ] 也终归是 i 最小素数分水设备,由于每个详表都是从素数的详表开端的。。

只不过 i*普里姆[ J ] 比起 i 它不但仅是最小的素分水设备。

这么 i*普里姆[ J ] 的约数和执意

后来的,敝用到后面保养下落最小素数分水设备那任一的和,由于 i 中 理应是


敝可以发生最小素数的和。,而且开腰槽

正确的第一体又。 乘以 普里姆[ J ] 话说回来再 加一,你可以开腰槽它。了。

sd(i*普里姆[ J ]) = SD(I) / SP[Ⅰ] * (SP[Ⅰ]*普里姆[ J ]+1)

一般 sp[i*普里姆[ J ]] = SP[Ⅰ]*普里姆[ J ]+1,持续雇用最小素数的和。。

粉底这样地,敝可以用一次的筛列出。 1 到 N 的约数和。

const int N=1e5+5;
bool 表现[ n]
int 老生常谈[成语]
long long SD[N],Sp[n];
int cnt;
void initial()
{
    cnt=0;
    sd[1]=1;
    for (int) i=2 ; i

发表评论

电子邮件地址不会被公开。 必填项已用*标注