POJ 3292 Semi-prime H-numbers (仿素数筛)

题目地址:POJ 3292

先利用素数筛的原理把H_prime筛出来,然后打表。要预处理,否则TLE。

代码如下:

#include <iostream>
#include <string.h>
#include <math.h>
#include <queue>
#include <algorithm>
#include <stdlib.h>
#include <map>
#include <set>
#include <stdio.h>
using namespace std;
#define LL __int64
#define pi acos(-1.0)
const int mod=100000000;
const int INF=0x3f3f3f3f;
const double eqs=1e-8;
int h_prime[1000000], tot, check[1000100], vis[1000002], num[1000002];
void init()
{
        int i, j;
        LL x, ans=0;
        tot=0;
        memset(check,0,sizeof(check));
        for(i=5;i<=1000001;i+=4){
                if(!check[i]){
                        h_prime[tot++]=i;
                }
                for(j=0;j<tot;j++){
                        if(i*h_prime[j]>1000001) break;
                        check[i*h_prime[j]]=1;
                        if(i%h_prime[j]==0) break;
                }
        }
        for(i=0;i<tot;i++){
                for(j=0;j<tot;j++){
                        x=h_prime[i]*h_prime[j];
                        if(x>1000001) break;
                        if(!vis[x]){
                                vis[x]=1;
                        }
                }
        }
        for(i=0;i<1000001;i++){
                if(vis[i]) ans++;
                num[i]=ans;
        }
}
int main()
{
        int n, i, pos, j;
        LL ans, x;
        init();
        while(scanf("%d",&n)!=EOF&&n){
                printf("%d %d\n",n,num[n]);
        }
        return 0;
}

时间: 2024-10-07 00:58:42

POJ 3292 Semi-prime H-numbers (仿素数筛)的相关文章

HDU 1016 Prime Ring Problem (素数筛+DFS)

题目链接 题意 : 就是把n个数安排在环上,要求每两个相邻的数之和一定是素数,第一个数一定是1.输出所有可能的排列. 思路 : 先打个素数表.然后循环去搜..... 1 //1016 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 6 using namespace std ; 7 8 bool vis[21]; 9 int prime[42] ,cs[21]; 10 int n ; 11

素数筛(1) 埃氏筛法

其原理就是先将2-n之内的所有数存在一个数组里,初始化所有数全为素数,然后从2开始寻找,只要标记是素数便将他的所有倍数的标记都改为合数,依次类推.时间复杂度为O(nloglogn). 代码实现 1 void prime_table() 2 { 3 for(int i=2;(LL)i<=n;i++) prime[i]=1; 4 for(int i=2;(LL)i*i<=n;i++) 5 if(prime[i]) for(LL j=i*i;j<=n;j+=i) prime[j]=0; 6 }

POJ 3126 Prime Path (bfs+欧拉线性素数筛)

Description The ministers of the cabinet were quite upset by the message from the Chief of Security stating that they would all have to change the four-digit room numbers on their offices. - It is a matter of security to change such things every now

!POJ 2689 Prime Distance-卡时间-(素数筛法)

题意:给定两个数l,r求这之间最近和最远的两个素数.数据范围是整数的上限.r-l<=10^6 分析:总思路是把l和r间的素数全部找出来,然后遍历一遍求最小距离和最大距离.用一个函数预处理数据范围内的所有素数是不现实的,一来数组不可r能开那么大二来会超时.想想素数筛的思想:用sqrt(n)以内的素数筛掉n以内的所有合数,剩下n以内的素数.这里既然预处理不可能,我们一样可以用sqrt(n)以内的素数来筛,只是这时这些素数预处理,然后每次输入l和r的时候用预处理的素数筛掉l和r之间的合数,剩下素数.s

POJ 3292 Semi-prime H-numbers(数)

Semi-prime H-numbers Description This problem is based on an exercise of David Hilbert, who pedagogically suggested that one study the theory of 4n+1 numbers. Here, we do only a bit of that. An H-number is a positive number which is one more than a m

POJ 2262-Goldbach&#39;s Conjecture(素数筛)

Goldbach's Conjecture Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 39435   Accepted: 15119 Description In 1742, Christian Goldbach, a German amateur mathematician, sent a letter to Leonhard Euler in which he made the following conject

poj 2886 线段树的更新+反素数

Who Gets the Most Candies? Time Limit: 5000 MS Memory Limit: 0 KB 64-bit integer IO format: %I64d , %I64u Java class name: Main [Submit] [Status] [Discuss] Description N children are sitting in a circle to play a game. The children are numbered from

POJ 2635 The Embarrassed Cryptographer (同余线性方程+素数筛)

题目地址:POJ 2635 先用素数筛把10^6万以内素数筛出来.然后把输入的那个大数转化成数组,并且每三位存成一个数,这样可以节约内存和时间,然后利用同余线性的原理,对那个小整数以内的所有素数枚举,然后判断是否整除,找到最小的能被整除的. 代码如下: #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #i

POJ 1811Prime Test(米勒拉宾素数测试)

直接套用模板,以后接着用 这里还有一个素因子分解的模板 1 #include <map> 2 #include <set> 3 #include <stack> 4 #include <queue> 5 #include <cmath> 6 #include <ctime> 7 #include <vector> 8 #include <cstdio> 9 #include <cctype> 10