> 文章列表 > 蓝桥杯刷题第十五天

蓝桥杯刷题第十五天

蓝桥杯刷题第十五天

第三题:质因数个数

问题描述
给定正整数 n, 请问有多少个质数n约数
输入格式
输入的第一行包含一个整数 n
输出格式
输出一个整数, 表示 n 的质数约数个数。
样例说明
396 有 2,3,11 三个质数约数。
评测用例规模与约定
对于 30% 的评测用例,1≤n≤10000 。
对于 60% 的评测用例, 1≤n≤109
对于所有评测用例, 1≤n≤1016
运行限制
最大运行时间:10s
最大运行内存: 512M

样例输入

396

样例输出

3

开始想到筛质数,过了90%,后面时间复杂度太高过不去

#include<iostream>
using namespace std;typedef long long LL;
const int N = 1e8;
LL n;
int primes[N], cnt;
bool st[N];void get_primes(){for(int i = 2; i <= N; i++){if(!st[i]) primes[cnt++] = i;for(int j = 0; primes[j] <= N / i; j++){st[primes[j] * i] = true;if(i % primes[j] == 0) break;}}
}int main(){ scanf("%lld", &n);get_primes();int ans = 0;for(int i = 0; i < cnt; i++){if(n % primes[i] == 0) ans++;}cout<<ans<<endl;return 0;
}

后面想到分解质因子,考虑 i 平方 <= n 个数

是约数,除下去,最后 n > 1,n是最后一个质数,而且是约数

#include<iostream>
using namespace std;typedef long long LL;
LL n;int main(){ scanf("%lld", &n);int ans = 0;for(int i = 2; i <= n / i; i++){if(n % i == 0){ans ++;while(n % i == 0) n /= i;}}if(n > 1) ans++;cout<<ans<<endl;return 0;
}