筛法求约数个数

Description

D i D_i Di表示 i i i的约数个数, n u m i num_i numi表示 i i i的最小质因子出现次数。

Proof

引理1:

若 n = ∏ i = 1 m p i c i , 则 D i = ∏ i = 1 m c i + 1 (1.1) 若n=\prod_{i=1}^{m}p_i^{c_i}\tag{1.1},则D_i=\prod_{i=1}^{m}c_i+1 n=i=1mpici,Di=i=1mci+1(1.1)

引理2:

若 n = i ∗ j ( g c d ( i , j ) = 1 ) , 则 D n = D i ∗ D j (1.2) 若n=i*j(gcd(i,j)=1),则D_n=D_i*D_j\tag{1.2} n=ij(gcd(i,j)=1),Dn=DiDj(1.2)

D D D为积性函数

solution

线性筛

实现:

void pre() {
  	d[1] = 1;
  	for (int i = 2; i <= n; ++i) {
    	if (!v[i])
            v[i] = 1, p[++tot] = i, d[i] = 2, num[i] = 1;
    	for (int j = 1; j <= tot && i <= n / p[j]; ++j) {
      		v[p[j] * i] = 1;
      		if (i % p[j] == 0) {
        		num[i * p[j]] = num[i] + 1;
        		d[i * p[j]] = d[i] / num[i * p[j]] * (num[i * p[j]] + 1);
        		break;
      		}
        	else {
        		num[i * p[j]] = 1;
        		d[i * p[j]] = d[i] * 2;
      		}
    	}
  	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值