Primes Problem
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5104
解题思路:
BestCoder官方题解:
首先将10000内的素数筛出来(约1000个), (p1,p2,p3) 枚举三元组前两个 p1,p2 ,可知若存在 p3 满足条件,必
有 p3=n−p1−p2 ,故令 t=n−p1−p2 。若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;
}