线性筛获取约数个数

前提知识

首先
对于一个大于1正整数n可以分解质因数:
n = p 1 d 1 + p 2 d 2 + . . . + p k d k , 其 中 p i 为 素 数 n = p_1^{d_1} + p_2^{d_2} + ... + p_k^{d_k},其中p_i为素数 n=p1d1+p2d2+...+pkdkpi

那么根据排列组合,可以知道
约 数 的 个 数 f a c t o r ( n ) = ( 1 + d 1 ) ( 1 + d 2 ) . . . ( 1 + d k ) 约数的个数factor(n) = (1+d_1)(1+d_2)...(1+d_k) factor(n)=(1+d1)(1+d2)...(1+dk)

开始筛选

首先我们引入一个数组 d ( i ) d(i) d(i)表示 i i i的最小质因子的次幂,(最小的原因是素数筛里每次都是用最小的质因子来筛合数的)

当 i 是 素 数 时 , 显 然 有 f a c t o r ( i ) = 2 , d [ i ] = 1 当i是素数时,显然有factor(i)=2,d[i]=1 i,factor(i)=2,d[i]=1
p j p_j pj表示一个素数

当i不是素数时,分两种情况;

当 i % p j ≠ 0 且 g c d ( i , p j ) = 1 时 , 由 积 性 函 数 的 性 质 可 得 f a c t o r [ i ∗ p j ] = f a c t o r [ i ] ∗ f a c t o r [ p j ] = f a c t o r [ i ] ∗ 2 ; d [ i ∗ p j ] = 1 当i\%p_j\neq0且gcd(i,p_j)=1时,由积性函数的性质可得factor[i * p_j] = factor[i] * factor[p_j] = factor[i] * 2;d[i*p_j]=1 i%pj=0gcd(i,pj)=1,factor[ipj]=factor[i]factor[pj]=factor[i]2;d[ipj]=1
当 i % p j = 0 时 , 说 明 p j 是 i 的 最 小 质 因 子 ; 因 此 f a c t o r [ i ∗ p j ] = f a c t o r [ i ] / ( d [ i ] + 1 ) ∗ ( ( d [ i ] + 1 ) + 1 ) ; d [ i ∗ p j ] = d [ i ] + 1 ; 当i\%p_j=0时,说明p_j是i的最小质因子; 因此factor[i * p_j] = factor[i] / (d[i] + 1) * ((d[i] + 1)+1); d[i*p_j]=d[i]+1; i%pj=0,pji;factor[ipj]=factor[i]/(d[i]+1)((d[i]+1)+1);d[ipj]=d[i]+1;

Code

 	factor[1]=1;
    for(int i=2;i<=n;++i){
        if(!noprime[i]){
            d[i]=1;
            factor[i]=2;
            prime[++tot] = i;
        }
        for(int j=1;i*prime[j]<=n&&j<=tot;++j){
            noprime[i*prime[j]] = 1;
            if(i%prime[j]==0){
                factor[i*prime[j]]=factor[i]/(d[i]+1)*(d[i]+2);
                d[i*prime[j]] = d[i]+1;
                break;
            }
            factor[i*prime[j]]=factor[i]*2;
            d[i*prime[j]]=1;
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值