srm 307 div2 1000(数论,枚举)

本文介绍了一种特殊的自然数——Preprime数,并提供了一个高效的算法来寻找第n个Preprime数。Preprime数定义为恰好有四个正因子的自然数。这类数要么是两个不同素数的乘积,要么是某个素数的三次幂。文中详细说明了如何通过类似素数筛法的方法生成一个表,记录每个数的素因子数目。
摘要由CSDN通过智能技术生成

题意:
有4正整数因子的自然数被称为preprime数。
求第n个preprime数。
思路:
可以得出结论,仅当某个数是两个素数的乘积或者是某个素数的3次方时为preprime。于是可以用类似素数筛法的方式,得到关于某数素因子数目的表(除自身外)。。
其实还可以更暴力,直接从2开始枚举,然后每个包含其作为因子的数的计数器加1。。。

const int MAX = 6000000;
int fac[MAX+1], tab[1000000+1];

class PreprimeNumbers
{
        public:
    PreprimeNumbers() {
        init();
    }

    void init() {
        int cnt = 0;
        int i;
        memset(fac, 0, sizeof(fac));
        for (i=2;cnt < 1000000;++i) {
            if (fac[i] == 2) {
                fac[cnt++] = i;continue;
            }
            else if (fac[i] == 0) {
                for (int j=i*2;j<=MAX;j += i) {
                    int t = j;
                    while (t%i == 0) {
                        t /= i;
                        ++fac[j];
                    }
                    if (t == 1) --fac[j];
                }
            }
        }
    }

        int nthNumber(int n)
        {
        return fac[n-1];
        }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值