暴力打表解决,但是求因子不能直接枚举,用类似判素数的筛法把1到1000000的所有因子求出来,因为最大的因子和近340W,直接开一个这么大的数组存,注意这里我直接声明数组的话会SF,可能是容量超限制了,用malloc就没问题,存完再求前段子和,所得和就是<m的数的个数
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
int i, j, a[1000001];
memset(a, 0, sizeof(a));
int *b = malloc(3400000 * sizeof(int));
a[1] = 1;
b[1]++;
for (i = 2; i <= 1000000; i++)
{
a[i]++;
for (j = i * 2; j <= 1000000; j += i)
a[j] += i;
b[a[i]]++;
}
for (i = 2; i < 3400000; i++)
b[i] += b[i - 1];
int m;
while (scanf("%d", &m) != EOF)
printf("%d\n", m >= 3400000 ? 1000000 : b[m]);
free(b);
return 0;
}