其中为数 的约数的个数, 为常数。

结论发现 范围的数全部满足上述公式, 范围的数只有 个不满足上述公式。

t cnt
1 24387
2 6620
3 2172
4 699
5 214
6 54
7 11
8 0

t cnt
5 6310
6 2162
7 1047
8 353
9 152
10 93
11 19
12 5
13 0

t cnt
10 3391
11 1766
12 1009
13 692
14 250
15 137
16 70
17 29
18 5
19 2
20 0

t cnt
10 69268
11 53934
12 27657
13 18302
14 13410
15 8455
16 4953
17 3695
18 2413
19 1679
20 858
21 515
23 260
24 110
25 62
26 27
27 19
28 8
29 6
30 0

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5;
const int times=2;
int prime[MAXN];
int num[MAXN],d[MAXN];

void get_di()
{
    num[1]=1;
    for(int i=2;i<MAXN;i++){
        if(!prime[i]){
            prime[++prime[0]]=i;
            num[i]=2;
            d[i]=1;
        }
        for(int j=1;j<=prime[0]&&i<MAXN/prime[j];j++){
            prime[i*prime[j]]=1;
            if(i%prime[j]==0){
                d[i*prime[j]]=d[i]+1;
                num[i*prime[j]]=num[i]/(d[i]+1)*(d[i]+2);
                break;
            }
            num[i*prime[j]]=num[i]*2;
            d[i*prime[j]]=1;
        }
    }
}

int main(void)
{
    for(int i=0;i<MAXN;i++) prime[i]=num[i]=d[i]=0;
    get_di();
    int cnt=0;
    for(int i=2;i<MAXN;i++){
        if(num[i]>=times*(int)(log(i)/log(2))+1){
            cnt++;
            // printf("%d %d\n", num[i],i);
        }
    }
    printf("%d\n", cnt);
}