poj3292-类素数筛选法

#include<iostream>
using namespace std;
const int N=1000002;
int array[N]={0};
int main(){
 int n;
 for(int i=5;i<=N;i+=4){
  for(int j=5;j<=N;j+=4){
   int num=i*j;
   if(i*j>N)
   break;
   if(array[i]==0&&array[j]==0)
   //如果 i,j 目前都不为两个数的乘积,那么i*j就是由两个类素数相乘的积;如果之后 i,j 不是类素数,那么由下面的语句也会将其替换成-1.
   array[num]=1;
   else
   array[num]=-1;
  }
 }
 int count=0;
 for(int i=0;i<N;i++){
  if(array[i]==1)
  count++;//设置累加器,输出所求数的个数
  array[i]=count;
 }
 while(cin>>n,n!=0){
  cout<<n<<" "<<array[n+1]<<endl;
 }
 return 0;
}

时间: 2024-08-09 02:19:03

poj3292-类素数筛选法的相关文章

hdu 5407 CRB and Candies(素数筛选法,除法取模(乘法逆元))

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5407 解题思路: 官方题解: The problem is just to calculate g(N) =\ LCM(C(N,0), C(N,1), ..., C(N, N))g(N) = LCM(C(N,0),C(N,1),...,C(N,N)). Introducing function f(n) =\ LCM(1, 2, ..., n)f(n) = LCM(1,2,...,n), the

HDU 2161 Primes (素数筛选法)

题意:输入一个数判断是不是素数,并规定2不是素数. 析:一看就很简单吧,用素数筛选法,注意的是结束条件是n<0,一开始被坑了... 不说了,直接上代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; typedef long long LL; const int maxn = 16000 + 10; int p

关于素数的快速查找——素数筛选法

利用素数筛选法进行素数的快速查找.原理很简单,素数一定是奇数,素数的倍数一定不是素数.思路如下: 预定义N表示10000,即表示查找10000以内的素数,首先定义数组prime[]对N以内的数进行标记,奇数存为1,偶数存为0,最终实现结果为素数的prime值为1,因此将prime[2]赋值为1(2是素数).之后利用for循环,对N以内的奇数进行遍历(注意for循环的条件控制),for里用if判断是否为素数(奇数),若是,执行内部嵌套的for循环判断该奇数是否为素数,若是则标记为1,若不是则pri

HDU 1164 Eddy&#39;s research I【素数筛选法】

思路:将输入的这个数分成n个素数的相乘的结果,用一个数组存储起来.之后再输出就可以了 Eddy's research I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6633    Accepted Submission(s): 3971 Problem Description Eddy's interest is very ext

POJ 2689 Prime Distance 素数筛选法应用

题目来源:POJ 2689 Prime Distance 题意:给出一个区间L R 区间内的距离最远和最近的2个素数 并且是相邻的 R-L <= 1000000 但是L和R会很大 思路:一般素数筛选法是拿一个素数 然后它的2倍3倍4倍...都不是 然后这题可以直接从2的L/2倍开始它的L/2+1倍L/2+2倍...都不是素数 首先筛选出一些素数 然后在以这些素数为基础 在L-R上在筛一次因为 R-L <= 1000000 可以左移开一个1百万的数组 #include <cstdio>

POJ 3978 Primes(素数筛选法)

题目 简单的计算A,B之间有多少个素数 只是测试数据有是负的 //AC //A和B之间有多少个素数 //数据可能有负的!!! #include<string.h> #include<stdio.h> //素数筛选法 int pri[100000+10];//1 合数, 0 素数 void Prime() { memset(pri,0,sizeof(pri)); pri[1]=pri[0]=1; for(int i=2;i<50002;i++) { if(pri[i]==0)

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

Description In 1742, Christian Goldbach, a German amateur mathematician, sent a letter to Leonhard Euler in which he made the following conjecture: Every even number greater than 4 can be written as the sum of two odd prime numbers. For example: 8 =

ZZUOJ-1222- 属于ACMer的游戏 猜素数 (某月赛,总结一下素数筛选法)

题目位置:1222: 属于ACMer的游戏 猜素数 1222: 属于ACMer的游戏 猜素数 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 88  Solved: 21 [Submit][Status][Web Board] Description ACM实验室的众大神们喜欢聚餐大家一起HAPPY 尤其卢学长喜欢请大家HAPPY,但是卢学长请吃饭有一个习惯,大家要一起玩一个热身游戏,猜素数. 游戏规则如下: 正常人的版本是这样:比如卢学长先约定一

暑期学习日记——超快的素数筛选法(改进)

素数筛选法: 最近发现了一个用bool数组去判断素数的方法,很强大,速度非常之快,方法是从大佬博客:https://www.cnblogs.com/wpnan/p/4073852.html 截下来的,可以看去看一下. 素数筛法是这样的: 1.开一个大的bool型数组prime[],大小就是n+1就可以了.先把所有的下标为奇数的标为true,下标为偶数的标为false. 2.然后: for( i=3; i<=sqrt(n); i+=2 ) { if(prime) for( j=i+i; j<=n

素数筛选法

筛选法(埃拉托色尼(Eratosthenes)筛法)求素数,例如1~100 思想:逐个筛选,直到int(sqrt(100))个 1)因为1不是质数,将1筛去 2)2是质数,将2的倍数全都挖掉 3)3是质数,将3的倍数全都挖掉 4)4已经被挖去,不进行与4相关的操作 5)5是质数,将5的倍数全都挖掉 6)这个过程一直进行到后面的数全都挖掉为止 不是从1开始:如10~18----一个一个筛--->18 #include <stdio.h> #include <math.h> #i