H - 牛牛的k合因子数
题目描述
(题目已经很简单就不再描述了)
合数是指自然数中除了能被1和本身整除外,还能被其他数(0除外)整除的数。
牛牛最近在研究“k合因子数”,所谓“k合数”是指一个数的所有因子中,是合数的因子共有k个。
例如20的因子有1,2,4,5,10,20,其中4,10,20为合数,它有3个合数因子,就称20是一个 “3合因子数”
牛牛想要知道1~n中给定k的情况下k合因子数的数目
题目分析
找的是合数因子,因此先把质数筛走,再筛合数,并统计合数作为因子的次数。
代码
#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
int n,m;
scanf("%d%d",&n,&m);
bool nprime[100001]={1};
int num[100001]={0};
int sum[100001]={0};
//这个sum数组不能开的太小 不然会WA
for(int i=2;i<=n;i++){
if(!nprime[i]){
for(int j=i+i;j<=n;j+=i){
nprime[j]=1;
}
}
}
for(int i=2;i<=n;i++){
if(nprime[i]){
for(int j=i;j<=n;j+=i){//注意是j=i而不是j=i+i
num[j]++;
}
}
}
for(int i=0;i<=n;i++){
//这里如果加多一个if(nprime[i])的判定貌似更省内存
sum[num[i]]++;
}
for(int i=0;i<m;i++){
int temp;
scanf("%d",&temp);
printf("%d\n",sum[temp]);
}
}