zoj 2723 Semi-Prime(素筛打表+搜索优化)

题目链接:

  http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2723

题目描述:

Prime Number Definition

An integer greater than one is called a prime number if its only
positive divisors (factors) are one and itself. For instance, 2, 11, 67,
89 are prime numbers but 8, 20, 27 are not.

Semi-Prime Number Definition

An integer greater than one is called a semi-prime number if it can be
decompounded to TWO prime numbers. For example, 6 is a semi-prime number
but 12 is not.

Your task is just to determinate whether a given number is a semi-prime number.

Input

There are several test cases in the input. Each case contains a single integer N (2 <= N <= 1,000,000)

Output

One line with a single integer for each case. If the number is a semi-prime number, then output "Yes", otherwise "No".

Sample Input

3

4

6

12

Sample Output

No

Yes

Yes

No

 1 /*问题 判断输入的n(n的范围是2到100 0000)是否为半素数
 2 解题思路 先用素筛法建立一张[2,50 0000]的素数表放在数组里,再将素数存进向量里,然后计算出2到100 0000的半素
 3 数表放在set集合里后查表即可*/
 4 #include <cstdio>
 5 #include <set>
 6 #include <cmath>
 7 #include <vector>
 8 using namespace std;
 9
10 int isPrim[500010];
11
12 void prim(int n);
13
14 int main()
15 {
16     prim(500000);
17
18     vector<int> prim_vec;//对于未知大小的数据来说非常方便
19     int i;
20     for(i=2;i<=500000;i++){
21         if(isPrim[i])
22             prim_vec.push_back(i);
23     }
24
25     set<int> prim_set;//查询起来非常快速、方便
26     int j,p;
27     for(i=0;i<prim_vec.size();i++){
28         for(j=0;j<prim_vec.size();j++){
29             if( (p = prim_vec[i]*prim_vec[j]) <=1000000)
30                 prim_set.insert(p);
31             else
32                 break;//一种优化方法,对于有顺序的数据
33         }
34     }
35
36     int n;
37     set<int>::iterator it;
38     while(scanf("%d",&n) != EOF)
39     {
40         it=prim_set.find(n);
41         if(it != prim_set.end())
42             printf("Yes\n");
43         else
44             printf("No\n");
45     }
46     return 0;
47 }
48
49 void prim(int n)
50 {
51     int i,j,k;
52
53     for(i=0;i<=n;i++)
54         isPrim[i]=1;//全部初始化为1,假定全是素数
55     isPrim[0]=isPrim[1]=0;//0和1非素数
56
57     k=(int)sqrt(n);
58     for(i=2;i<=k;i++){
59         if(isPrim[i]){
60             for(j=2*i;j<=n;j+=i)
61                 isPrim[j]=0;
62         }
63     }
64     /*
65     int count=0;
66     for(i=2;i<=n;i++){
67         if(isPrim[i])
68             count++;//记录50 0000以内的素数有41538个,验证素筛写的对不对
69     }
70     printf("%d\n",count);
71     */
72 }

原文地址:https://www.cnblogs.com/wenzhixin/p/8543728.html

时间: 2024-10-14 11:17:36

zoj 2723 Semi-Prime(素筛打表+搜索优化)的相关文章

ACdream 1112 Alice and Bob(素筛+博弈SG函数)

Alice and Bob Time Limit:3000MS     Memory Limit:128000KB     64bit IO Format:%lld & %llu Submit Status Practice ACdream 1112 Description Here  is Alice and Bob again ! Alice and Bob are playing a game. There are several numbers. First, Alice choose

Codeforces 542D Superhero&#39;s Job 数论 哈希表 搜索

原文链接https://www.cnblogs.com/zhouzhendong/p/CF542D.html 题目传送门 - CF542D 题目传送门 - 51Nod1477 题意 定义公式 $J(x) = \sum_{1 \leq k \leq x 且 k|x 且 \gcd (k,x/k) = 1} k$ . 现在给定一个整数 $A$ ,要求有多少正整数 $x$ ,满足 $J(x)=A$ . $x|n$ 表示 $x$ 是 $n$ 的因子. $\gcd(a,b) 表示 $a$ 和 $b$ 的最大

[ACM] 1016 Prime Ring Problem (深度优先搜索)

Prime Ring Problem Problem Description A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent circles should be a prime. Note: the number of first circle

ListSet_无序表搜索

无序表搜索就是一个个的遍历, 从头开始逐个检查, 直到表中关键字值等于给定关键字值, 则查找成功. 或者查完整个表, 查找失败为止. 搜索失败的平均搜索长度:(n + 1) / 2. 实现代码: #include "iostream" #include "cstdio" #include "cstring" #include "algorithm" #include "assert.h" using nam

10 表连接优化

本章提要-----------------------------------------查询优化器要确定多张表的连接顺序和连接方法, 目的是通过尽早的过滤不需要的数据, 减少要处理的数据量.本章会介绍3种基本连接方法: 嵌套循环连接, 合并连接, 哈希连接如何选择连接放的的基本建议.----------------------------------------- 10.1 定义    连接树    数据库引擎支持的所有的连接方法都是每次只能处理两个数据集. 它们被称作 左节点 和 右节点,

mySQL表结构优化

前言 很多人都将<数据库设计范式>作为数据库表结构设计"圣经",认为只要按照这个范式需求设计,就能让设计出来的表结构足够优化,既能保证性能优异同时还能满足扩展性要求.殊不知,在N年前被奉为"圣经"的数据库设计3范式早就已经不完全适用了.这里我整理了一些比较常见的数据库表结构设计方面的优化技巧,希望对大家有用. 由于MySQL数据库是基于行(Row)存储的数据库,而数据库操作 IO 的时候是以 page(block)的方式,也就是说,如果我们每条记录所占用

ZOJ 3644 Kitty&#39;s Game dfs,记忆化搜索,map映射 难度:2

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4834 从点1出发,假设现在在i,点数为sta,则下一步的点数必然不能是sta的因数,所以不会形成环,只需从1直接走,走到n即可. 但是如果这样的话时空复杂度就都是nk,明显不满足题意,而这个时候我们可以想到,每个状态都必然是k的约数,(点数不是k的约数的节点不在路上,可以无视),而约数的个数也就k^0.5个,可以直接用map映射,这样时空复杂度都是n*k^0.5,可以解出答案

20亿与20亿表关联优化方法(超级大表与超级大表join优化方法)

记得5年前遇到一个SQL.就是一个简单的两表关联.SQL跑了几乎相同一天一夜,这两个表都非常巨大.每一个表都有几十个G.数据量每一个表有20多亿,表的字段也特别多. 相信大家也知道SQL慢在哪里了,单个进程的PGA 是绝对放不下几十个G的数据,这就会导致消耗大量temp tablespace,SQL慢就是慢在temp来回来回来回...的读写数据. 遇到这样的超级大表与超级大表怎么优化呢?这篇文章将告诉你答案. 首先创建2个測试表 t1,t2 数据来自dba_objects create tabl

MySQL详解(22)------------表结构优化

很多人都将 数据库设计范式 作为数据库表结构设计"圣经",认为只要按照这个范式需求设计,就能让设计出来的表结构足够优化,既能保证性能优异同时还能满足扩展性要求.殊不知,在N年前被奉为"圣经"的数据库设计3范式早就已经不完全适用了.此课时整理了一些比较常见的数据库表结构设计方面的优化技巧,希望对大家有用. 由于MySQL数据库是基于行(Row)存储的数据库,而数据库操作 IO 的时候是以 page(block)的方式,也就是说,如果我们每条记录所占用的空间量减小,就会