【NC17450】因数个数和

题目

因数个数和

因数个数,找规律

思路

根据题意,可以知道不可能使用朴素的方法挨个求解结果

对任意一个正整数 x x x,其所有因数的分布规律是要么小于等于 ⌊ x ⌋ \lfloor \sqrt x \rfloor x ,要么大于 ⌊ x ⌋ \lfloor \sqrt x \rfloor x

于是可以枚举小于等于 ⌊ x ⌋ \lfloor \sqrt x \rfloor x 的因数,并在枚举过程中计算所有因数的个数之和。

对于小于等于 ⌊ x ⌋ \lfloor \sqrt x \rfloor x 的因数 i i i,可以直接求其贡献值,即 1 → x 1\to x 1x 中有多少个数字含有该因子 i i i,可以求得 i i i 的贡献值为 ⌊ x i ⌋ \lfloor {x\over{i}} \rfloor ix,然后利用 i i i 求大于 ⌊ x ⌋ \lfloor \sqrt x \rfloor x 范围内的贡献,即找 i × m i\times m i×m,其中 m m m 是刚刚好大于 ⌊ x ⌋ \lfloor \sqrt x \rfloor x 并且 i × m i\times m i×m 还在 x x x 范围内的数字的个数,那么该数的范围为 ⌊ x ⌋ + 1 → ⌊ x i ⌋ \lfloor\sqrt x\rfloor+1 \to \lfloor {x\over{i}} \rfloor x +1ix,贡献值则为 ⌊ x i ⌋ − ⌊ x ⌋ \lfloor {x\over{i}} \rfloor-\lfloor\sqrt x\rfloor ixx

举个例子,比如求 1 → 10 1\to 10 110 的因数个数和,则有下面的过程:

  1. 首先是看 1 1 1 的贡献,为 10 / 1 10/1 10/1,共有 10 10 10 个数有 1 1 1 这个因子
  2. 然后是找 1 × m 1\times m 1×m,满足要求的数字有 1 × 4 , 1 × 5 , … 1 × 10 1\times 4,1\times 5,\dots 1\times 10 1×4,1×5,1×10,共 7 7 7
  3. 2 2 2 的贡献,为 10 / 2 10/2 10/2,共有 5 5 5 个数有 2 2 2 这个因子
  4. 然后有 2 × 4 , 2 × 5 2\times 4,2\times 5 2×4,2×5,共 2 2 2
  5. 然后看 3 3 3 的贡献,为 10 / 3 10/3 10/3,共有 3 3 3 个数有 3 3 3 这个因子
  6. 然后由于 3 × 4 > 10 3\times 4>10 3×4>10,所以共 0 0 0
  7. 综上,总的因数个数和为 10 + 7 + 5 + 2 + 3 + 0 = 27 10+7+5+2+3+0=27 10+7+5+2+3+0=27

代码

#include <math.h>
#include <stdio.h>
typedef long long LL;

/**
 * @brief 计算 1 到 n 的因子个数和
 *
 * @param n
 * @return LL
 */
LL fact_cnt(int n) {
    LL res = 0;
    int s = sqrt(n);
    for (int i = 1; i * i <= n; i++) {
        // res += n / i;
        // res += n / i - s;
        // 下面这句是上面两句的合并
        res += (n / i << 1) - s;
    }
    return res;
}

int main(void) {
    int q = 0, n = 0;
    scanf("%d", &q);
    while (q--) {
        scanf("%d", &n);
        printf("%lld\n", fact_cnt(n));
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木又可可

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值