版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SSL_hzb/article/details/82021276
题意
给出 ,求出 的质因子和它们的个数。
思路
如果直接分解
的质因子,时间复杂度很大,我们可以考虑别的做法。
因为
,所以
的质因子不会超过
,我们就可以先筛出
的质数,然后判断
的质因子的个数。
中的质数
的个数就为
中包含质因子
的个数的和,那么显然在
中包含一个质因子
的数的个数为
个,然后我们可以判断含两个质因子
的数,那么这个的数量就为
。
综上所述,
中质因子
的个数为:
代码
#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]]);
}