Prime Factorization using Sieve O(log n) for multiple queries

使用筛法在 O(logN) 的时间内查询多组数的素数因子

前言

通常, 我们使用 O(n ^ 2) 的两层循环来进行打表, 记录一个数字是否为素数, 再使用 O(n) 的循环来求所有素因子.

然而, Nitish Kumar提供了一种在 O(nloglogn) 内打表, O(logN) 时间内查询的算法.

核心思想

这种算法的核心思想是, 使用 spf[] 存放每一个数的最小素因子(Samllest Prime Factor), 对于每个数 /= 他的最小素因子, 直到这个数变为 1.

代码实现

#include "bits/stdc++.h"
using namespace std; #define MAXN 100001 int spf[MAXN]; void sieve()
{
spf[1] = 1;
for (int i=2; i<MAXN; i++) spf[i] = i; // 排除所有偶数因子, 使计算量减半.
for (int i=4; i<MAXN; i+=2)
spf[i] = 2; // 外层循环枚举 [3, sqrt(MAXN))
// 内层循环进行 [i * i, MAXN)的验证
// 有效地减少重复计算
for (int i=3; i*i<MAXN; i++){
if (spf[i] == i){
for (int j=i*i; j<MAXN; j+=i)
// 如果 spf[j] = j, 说明从未更新过值
// 更新过一次后不再更新, 保证spf[i]为 最小 素因子
if (spf[j]==j)
spf[j] = i;
}
}
} vector<int> getFactorization(int x){
vector<int> ret;
while (x != 1){
ret.push_back(spf[x]);
x = x / spf[x];
}
return ret;
} int main(int argc, char const *argv[])
{
sieve();
int x = 12246;
cout << "prime factorization for " << x << " : "; vector <int> p = getFactorization(x); for (int i=0; i<p.size(); i++)
cout << p[i] << " ";
cout << endl;
return 0;
}

使用筛法在 O(logN) 的时间内查询多组数的素数因子的更多相关文章

  1. 欧拉筛法模板and 洛谷 P3383 【模板】线性筛素数(包括清北的一些方法)

    题目描述 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入格式 第一行包含两个正整数N.M,分别表示查询的范围和查询的个数. 接下来M行每行包含一个不小于1 ...

  2. mysql数据库管理工具sqlyog在首选项里可以设置默认查询分页条数和字体,改写关键字大小写

    sqlyog设置一直习惯用sqlyog来管理mysql数据库,但有三个地方用得不是很爽:1.默认查询条数只有1000条经常需要勾选掉重新查询.2.自动替换关键字大小写,有时候字段名为关键字的搞成大写的 ...

  3. group by查询每组时间最新的一条记录

    最近需要查询每组时间最新的记录 表如下:

  4. mysql查询语句,通过limit来限制查询的行数。

    mysql查询语句,通过limit来限制查询的行数. 例如: select name from usertb where age > 20 limit 0, 1; //限制从第一条开始,显示1条 ...

  5. MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询

    MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...

  6. SQL 查询每组的第一条记录

    CREATE TABLE [dbo].[test1]( [program_id] [int] NULL, [person_id] [int] NULL ) ON [PRIMARY] /*查询每组分组中 ...

  7. 查询MS sql server里的所有表 SQL中所有列,说明,类型 查询总存储过程数

    1.查询SQL中的所有表: Select TABLE_NAME FROM   "你的数据库名称".INFORMATION_SCHEMA.TABLES Where TABLE_TYP ...

  8. poj 2763 Housewife Wind : 树链剖分维护边 O(nlogn)建树 O((logn)²)修改与查询

    /** problem: http://poj.org/problem?id=2763 **/ #include<stdio.h> #include<stdlib.h> #in ...

  9. hdu 3966 Aragorn's Story : 树链剖分 O(nlogn)建树 O((logn)²)修改与查询

    /** problem: http://acm.hdu.edu.cn/showproblem.php?pid=3966 裸板 **/ #include<stdio.h> #include& ...

随机推荐

  1. python django bootstrap_导入 201901

    参考 http://www.liujiangblog.com/course/django/124 AdminLTE-2.4.5 http://www.liujiangblog.com/course/d ...

  2. oracle数据库代码块

    --申明变量.游标 declare a ):'; --逻辑 begin INSERT into TEMP_DSF.TEST VALUES (a); end; tips:mysql不支持匿名块.仅在存储 ...

  3. spring中注解注入 context:component-scan 的使用说明

    通常情况下我们在创建spring项目的时候在xml配置文件中都会配置这个标签,配置完这个标签后,spring就会去自动扫描base-package对应的路径或者该路径的子包下面的java文件,如果扫描 ...

  4. shell中各种括号()、(())、[]、[[]]、{}的作用和区别

    查看原文 - CSDN

  5. Linpack之HPCG测试

    平台信息 Description: CentOS Linux release 7.6.1810 (Core) 注意事项 安装HPL之前需要配置好: CXX编译器(检查:c++ -v) MPICH 并行 ...

  6. Unity 用JSON库序列化与反序列化类,字典

    Unity自己的json序列化是不支持字典格式的,但是 json .net库,功能很强大,还支持序列化字典. 下载地址:https://download.csdn.net/download/qq_15 ...

  7. w3schools juerymobile

    http://www.w3schools.com/jquerymobile/jquerymobile_examples.asp <!DOCTYPE html> <html> & ...

  8. react做股票、期货交易遇到的问题(不完全是react)及解决方法。

    公司项目主要是做股票及期货行情展示及交易,h5相应的做了一些功能---可以看行情图及模拟交易,实盘交易存在一定的风险,老板希望做自己的产品,这样h5就尴尬了,不过没关系,项目里还是有一定技术含量的-- ...

  9. AngularJS directive 不执行

    检查下directive的命名,是不是含有特殊符号和大写,全部改为小写就ok: 原因:html不支持骆驼峰命名,只支持小写:

  10. [转]javascript之数组操作

    javascript之数组操作 .数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个 ...