SGU 231 Prime Sum 求<=n内有多少对素数(a,b)使得a+b也为素数 规律题

题目链接:点击打开链接

题意:

求<=n内有多少对素数(a,b)使得a+b也为素数

思路:

我们发现所有素数间隔都是>=2的,且除了2都是奇数,那么:

奇数+奇数 = 偶数。

所以只有一种情况2+素数=素数。

所以打个素数表,看一下有多少个素数和前面那个素数间隔是2的。

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <math.h>
#include <queue>
#include <set>
#include <algorithm>
using namespace std;
#define N 88498
typedef int ll;
ll prime[N], primenum, ans[N];
void PRIME(ll Max_Prime){
    primenum = 0;
    prime[primenum++] = 2;
    for(ll i = 3; i <= Max_Prime; i+=2)
        for(ll j = 0; j < primenum; j++)
        if(i%prime[j]==0)break;
        else if(j == primenum-1 || prime[j] > sqrt((double)i))
        {
            prime[primenum++] = i;
            break;
        }
}
int n;
void solve(){
    int pos = lower_bound(prime, prime+primenum, n)-prime;
    if(prime[pos]!=n)pos--;
    printf("%d\n", ans[pos]);
    for(int i = 1; i <= pos; i++)
        if(ans[i-1]!=ans[i])
            printf("2 %d\n", prime[i-1]);
}
int main(){
    PRIME(1000000);
  //  for(int i = 0; i <= 10; i++)printf("%d ", prime[i]);
  //  printf("%d\n", primenum);
    memset(ans, 0, sizeof ans);
    for(int i = 1; i < primenum; i++)
    {
        if(prime[i-1] == prime[i] - 2)
            ans[i]++;
    }
    for(int i = 1; i < primenum; i++)
        ans[i] += ans[i-1];
	while(~scanf("%d",&n))
        solve();
	return 0;
}
时间: 2024-07-28 13:39:42

SGU 231 Prime Sum 求<=n内有多少对素数(a,b)使得a+b也为素数 规律题的相关文章

SGU 231.Prime Sum

题意: 求有多少对质数(a,b)满足a<=b 且a+b也为质数.(a+b<=10^6) Solution: 除了2之外的质数都是奇数,两个奇数的和是偶数,不可能是质数.所以题目就是求差为2的质数对的个数. 先用筛法刷出10^6内的质数,用bool数组标记(int型数组会超内存),然后扫一遍筛出来的质数,统计满足要求的答案就行了. #include <iostream> using namespace std; const int INF = 1000002; bool f[INF]

求 0-N 内有多少个素数

问题:求 0-N 内素数的个数. 预备知识 什么是素数:素数(又叫质数),与之相反的是合数.素数的因数只有 1 和 他本身,例如:7 = 1 * 7.而 6 = 1 * 6 = 2 * 3,因此6不是素数. 规定:0 和 1 既不是 素数 也不是 合数. 判断素数:如果一个数 x 是素数,那么在整数范围 [2,√x ] 之间,找不到任何能整除x 的整数.为什么只需要尝试到 √x ,而不是 n-1 呢?(肯定不是n呀,因为n是他本身,判断 n 就和判断 1 一样,没有意义的). √x 的由来:一个

埃氏筛法(求n以内有多少个素数)

题目大意:给定整数n,请问n以内有多少个素数 思路:想必要判断一个数是否是素数,大家都会了,并且可以在O(根号n)的复杂度求出答案,那么求n以内的素数呢,那样求就显得有点复杂了,下面看一下这里介绍的??氏算法 其实呢,就是求出第一个素数,然后把n以内它的倍数都删掉就行了,很简单.然后找下一个素数,同样方法····· 看代码 #include<iostream> #include<string.h> #include<map> #include<cstdio>

求100内质数的个数

// 求100内质数的个数 非容斥 #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<cstring> using namespace std; int n,sum; int main() { scanf("%d",&n); for(int i=1;i<=

HDU 4417 Super Mario(主席树求区间内的区间查询+离散化)

Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5101    Accepted Submission(s): 2339 Problem Description Mario is world-famous plumber. His “burly” figure and amazing jumping abilit

POJ 2761-Feed the dogs(划分树)求区间内第k小的数

Feed the dogs Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 17679   Accepted: 5561 Description Wind loves pretty dogs very much, and she has n pet dogs. So Jiajia has to feed the dogs every day for Wind. Jiajia loves Wind, but not the

我的Java开发学习之旅------&gt;求N内所有的素数

一.素数的概念 质数(prime number)又称素数,有无限个.一个大于1的自然数,除了1和它本身外,不能被其他自然数(质数)整除,换句话说就是该数除了1和它本身以外不再有其他的因数:否则称为合数. 根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积:而且如果不考虑这些质数在乘积中的顺序,那么写出来的形式是唯一的.最小的质数是2 二.算法 算法1. 开根号法:如果一个数(>2),对这个数求平方根,如果这个数能被这个数的平方根到2之间的任何一个(只要有一个就

C++_第七章函数的基本知识_求阶乘的子函数_ 函数参数类型为数组_ 求数组内所有元素和、部分元素和的方法_实现了先从键盘输入到一个数组中,再用for循环取读出数组中的元素 for循环也可以用break来结束循环的

/* 第七章函数的基本知识 */ /*01)c++对于返回值有一定的限制:可以是常量.变量.指针.结构对象或表达式,但不可以是数组02)c++返回数组的方法:将数组作为结构会对象组成部分来返回03)函数遇到return则结束该函数04)如果一个函数的两房额参数类型相同,则必须分别制定每个参数的类型,而不能像声明常规变量那样,将声明组合在一起05)*/ //本代码注意double类型的写法以及double和int类型数据的转换 1 #include <iostream> 2 3 void che

HDU4622:Reincarnation(后缀数组,求区间内不同子串的个数)

Problem Description Now you are back,and have a task to do: Given you a string s consist of lower-case English letters only,denote f(s) as the number of distinct sub-string of s. And you have some query,each time you should calculate f(s[l...r]), s[l