用筛法求约数和 为什么要加cnt<j
查看原帖
用筛法求约数和 为什么要加cnt<j
1021623
AVLw楼主2023/11/5 14:09

注释加了 第二层for循环那边 线性筛是不需要j<cnt的 为什么筛法求约数和不加j<cnt就过不了 有什么不一样吗

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include<cstdio>
using namespace std;
typedef long long LL;
const int N = 1e6 + 10;
int d[N], a[N], p[N];
int cnt; bool vis[N];

void get_d(int n) {
    d[1] = 1;
    for (int i = 2; i <= n; i++) {
        if (!vis[i]) {
            p[cnt++] = i;
            a[i] = 1;
            d[i] = 2;
        }
      //为什么要加j<cnt 
        for (int j = 0;j<cnt&& p[j] <= n / i; j++) {
            int m = i * p[j];
            vis[m] = 1;
            if (i % p[j] == 0) {
                a[m] = a[i] + 1;
                d[m] = d[i] / a[m] * (a[m] + 1);
            }
            else {
                a[m] = 1;
                d[m] = d[i] * 2;
            }
        }
    }
}


int main() {
    
    int n;
    scanf("%d", &n);
    get_d(n);
    LL sum = 0;
    for (int i = 1; i <= n; i++) {
        sum += d[i];
    }
    printf("%lld", sum);

    return 0;
}

2023/11/5 14:09
加载中...