zoukankan      html  css  js  c++  java
  • HDU 4715 Difference Between Primes (素数表+二分)

    Difference Between Primes

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 2998    Accepted Submission(s): 850


    Problem Description
    All you know Goldbach conjecture.That is to say, Every even integer greater than 2 can be expressed as the sum of two primes. Today, skywind present a new conjecture: every even integer can be expressed as the difference of two primes. To validate this conjecture, you are asked to write a program.
     
    Input
    The first line of input is a number nidentified the count of test cases(n<10^5). There is a even number xat the next nlines. The absolute value of xis not greater than 10^6.
     
    Output
    For each number xtested, outputstwo primes aand bat one line separatedwith one space where a-b=x. If more than one group can meet it, output the minimum group. If no primes can satisfy it, output 'FAIL'.
     
    Sample Input
    3
    6
    10
    20
     
    Sample Output
    11 5
    13 3
    23 3
     
    Source
     
     
    题意:求两个素数的差为一个偶数的素数组合,如果存在多个,输出小的
    分析:打出素数表,然后从小的开始枚举,二分查找就行。不过很奇怪的是,我一开始没有看到要加FAIL竟然也过了,也是醉的不行。
    #pragma comprint(linker, "/STACK:1024000000,1024000000")
    #include<cstdio>
    #include<string>
    #include<iostream>
    #include<cstring>
    #include<cmath>
    #include<stack>
    #include<queue>
    #include<vector>
    #include<map>
    #include<stdlib.h>
    #include<ctime>
    #include<algorithm>
    #define LL __int64
    #define FIN freopen("in.txt","r",stdin)
    using namespace std;
    const int MAXN=5000000;
    int pri[MAXN],vis[MAXN];
    int x,cnt;
    void sieve(int n)
    {
        int m=(int)sqrt(n+0.5);
        memset(vis,0,sizeof(vis));
        for(int i=2;i<=m;i++) if(!vis[i])
            for(int j=i*i;j<=n;j+=i) vis[j]=1;
    }
    int init(int n)
    {
        sieve(n);
        cnt=0;
        for(int i=2;i<=n;i++) if(!vis[i])
            pri[++cnt]=i;
    }
    int main()
    {
        //FIN;
        init(MAXN);
        int kase;
        scanf("%d",&kase);
        while(kase--)
        {
            bool flag=false;
            scanf("%d",&x);
            for(int i=1;i<cnt;i++)
            {
                int id=lower_bound(pri+1,pri+cnt,pri[i]+x)-pri;
                if(pri[id]==pri[i]+x)
                {
                    printf("%d %d
    ",pri[id],pri[i]);
                    flag=true;
                    break;
                }
            }
            if(!flag) printf("FAIL
    ");
        }
        return 0;
    }
    View Code
     
  • 相关阅读:
    C++ Primer 随笔 Chapter 2 变量和基本类型
    比较全面的gdb调试命令 (转载)
    open和fopen的区别(转)
    来了
    Function语义学之member function
    TCP/IP学习(四)TCP缓冲区大小及限制(转)
    TCP连接的建立和终止
    Data 语义学(2)
    Data 语义学(1)
    一个类到底有多大?
  • 原文地址:https://www.cnblogs.com/clliff/p/4743538.html
Copyright © 2011-2022 走看看