对线性筛法进行修改,就可以在O(n)复杂度内,递推求得n以内所有整数的约数个数。
#include<iostream>
using namespace std;
const int MaxPrimeNum = 278499, MaxSize = 1000001;
int num_prime = 0, MinPrime[MaxSize], MaxPrime[MaxSize]; //分别记录可以整除MaxSize的最小与最大prime的index //MaxPrime可以改成bit类型数组来记录是否是prime或者是否是Prime幂次方
int fact_num[MaxSize], MinPrime_num[MaxSize];
int prime[MaxPrimeNum], myresult;
//自己修改,欧拉筛法求n以内的所有素数,存在prime数组里,index从1到num_prime-1 。
//并同时求出n以内的所有数的最小质因子与最大质因子,分别存在MaxPrime数组与MinPrime数组里
//复杂度O(n)
void euler_sieve(int n)
{
int i, j, len, tmp;
// i = 2;
// prime[len = MinPrime[i] = num_prime++] = i;
num_prime = 1;
for (i = 2; i < n; ++i)
{
if (!MinPrime[i])
{
prime[len = MinPrime[i] = num_prime++] = i;
MinPrime_num[i] = 1;
fact_num[i] = 2;
}
else
{
if (myresult < fact_num[i])
{