【数论 质数】Contest Hunter_3101 阶乘分解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SSL_hzb/article/details/82021276

题意

给出 N ,求出 N ! 的质因子和它们的个数。

思路

如果直接分解 1 N 的质因子,时间复杂度很大,我们可以考虑别的做法。
因为 N ! = 1 2 3 . . . N ,所以 N ! 的质因子不会超过 N ,我们就可以先筛出 1 N 的质数,然后判断 N ! 的质因子的个数。
N ! 中的质数 p 的个数就为 1 N 中包含质因子 p 的个数的和,那么显然在 1 N 中包含一个质因子 p 的数的个数为 N / p 个,然后我们可以判断含两个质因子 p 的数,那么这个的数量就为 N / p 2
综上所述, N ! 中质因子 p 的个数为:
N p k p k N

代码

#include<cmath>
#include<cstdio>
int n, m, v[1000001], prime[1000001], c[1000001];
void calc_prime(int n) {
    for (int i = 2; i <= n; i++) {
        if (!v[i]) {
            v[i] = i;
            prime[++m] = i;
        }
        for (int j = 1; j <= m; j++) {
            if (prime[j] > v[i] || prime[j] > n/i) break;
            v[i * prime[j]] = prime[j];
        }
    }
}
int main() {
    scanf("%d", &n);
    calc_prime(n);
    for (int i = 1; i <= m; i++) 
        for (long long x = prime[i]; x <= n; x *= prime[i]) 
            c[prime[i]] += n / x;
    for (int i = 1; i <= m; i++) printf("%d %d\n", prime[i], c[prime[i]]);
}

猜你喜欢

转载自blog.csdn.net/SSL_hzb/article/details/82021276