求N个数的阶乘相乘素因子个数总和

#include <bits/stdc++.h>
using namespace std;
bool vis[10000004];
vector<long long>prim;
long long maxprim[10000004];//最大素因子
long long num[10000004];
int main() {
    memset(vis, 0, sizeof(vis));
    memset(num, 0, sizeof(num));
    memset(maxprim, 0, sizeof(maxprim));
    for (int i = 2; i <= 10000000; ++i) {
        if (!vis[i]) {
            prim.push_back(i);
            maxprim[i] = i;
        }
        for (int j = 0; j < prim.size(); ++j) {
            if (i * prim[j] > 10000000)break;
            vis[i * prim[j]] = 1;
            maxprim[i * prim[j]] = prim[j];
            if (i % prim[j] == 0)break;
        }
    }
    long long n;
    long long maxi = 0;
    long long x;
    long long sum = 0;
    scanf("%lld", &n);
    for (int i = 0; i < n; ++i) {
        scanf("%lld", &x);
        sum += x;
        num[x]++;
        maxi = max(maxi, x);
    }
    for (int i = maxi; i >= 2; --i) {
        num[i] += num[i + 1];
    }
    for (int i = maxi; i >= 2; --i) {
        if (vis[i]) {
            num[maxprim[i]] += num[i];
            num[i / maxprim[i]] += num[i];
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_42671946/article/details/85063698