HDU5104 Primes Problem(素数筛选法)

   

Primes Problem

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=5104

题思路:

BestCoder官方题解:

首先将10000内的素数筛出来(约1000个), (p1,p2,p3) 枚举三元组前两个 p1,p2 ,可知若存在 p3 满足条件,必

p3=np1p2 ,故令 t=np1p2 。若t为不小于 p2 的素数,则t满足 p3 的条件。则答案加一。

要用素数筛选法,不然会超时,然后再按题解求出即可。

素数筛选法:http://blog.csdn.net/tongyongzh/article/details/6693409

AC代码:

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

const int maxn = 10010;
int pr[maxn] = {0};
int prime[1500];

int main(){
    int i,j,t;
    t = sqrt(maxn*1.0)+1;
    for(i = 2; i <= t; i++)
        for(j = 2; j <= maxn/i; j++)
            pr[j*i] = 1;
    j = 0;
    for(i = 2; i <= maxn; i++)
        if(pr[i] == 0)
            prime[j++]=i;
    //cout<<j<<endl;
    int n;
    while(scanf("%d",&n)!=EOF){
        int p,q,ans = 0;
        double m = n/3;
        for(i = 0; i <= j; i++){
            if(prime[i] > m)
                break;
            for(p = i; p <= j; p++){
                if(prime[p] >= n)
                    break;
                q = n-prime[i]-prime[p];
                if(q < prime[p])
                    continue;
                if(pr[q] == 0)
                    ans++;//cout<<prime[i]<<endl;cout<<prime[p]<<endl;}
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}


你可能感兴趣的:(素数筛选法)