题目大意
求出不大于 n n n 的正整数中恰好有 9 9 9 个正因子的个数。
题目分析
先来看一下一个数论的小知识:自然数因数的个数等于它分解质因数后各质因数指数加 1 1 1 的和的乘积。
那么 9 9 9 个因数的数就必定满足下列公式之一:
- x = a 2 × b 2 x=a^2\times b^2 x=a2×b2
-
x
=
a
8
x=a^8
x=a8
而且 a a a 和 b b b 都是质数,我们就只需要用欧拉筛来创建一个质数数组,并且枚举 a a a 和 b b b 即可。
AC代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
//定义一个范围是1~1e6的质数数组,因为1e12的平方根是1e6。
bool isp[1000005];
int n,k,ans,p[1000005];
//欧拉筛
void work(){
memset(isp,1,sizeof isp);
isp[1]=0;
for(int i=2;i<=1000005;i++){
if(isp[i]==1) p[++k]=i;
for(int j=1;j<=k&&i*p[j]<=1000005;j++){
isp[i*p[j]]=0;
if(i%p[j]==0) break;
}
}
}
main(){
cin>>n;
work();
//公式一
for(int i=1;i<=k;i++){
//如果自己乘上下一个质数就比n大,就没有下去的意义了。
if((p[i]*p[i]*p[i+1]*p[i+1])>n){
break;
}else{
//枚举第二个质数
for(int j=i+1;j<=k;j++){
if(p[i]*p[i]*p[j]*p[j]<=n) ans++;
else break;
}
}
}
//公式二
for(int i=1;i<=k;i++){
if(pow(p[i],8)<=n) ans++;
else break;
}
cout<<ans;
return 0;
}