Primes Problem
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3384 Accepted Submission(s): 1515
Problem Description
Given a number n, please count how many tuple(p1, p2, p3) satisfied that p1<=p2<=p3, p1,p2,p3 are primes and p1 + p2 + p3 = n.
Input
Multiple test cases(less than 100), for each test case, the only line indicates the positive integern(n≤10000).
Output
For each test case, print the number of ways.
Sample Input
3 9
Sample Output
0
2
题意:给一个数n,问有多少种三个素数的组合,使三个素数的和等于n; 其中 如 2 2 5 和 2 5 2 以及 5 2 2是重复的
思路,素数打表,先枚举两个素数,算n减去他们的和是否也是素数,但是这样会产生重复,因为枚举的次序是从小到大的,因此设n-prime[i]-prime[j]>prime[j]为去重条件,使n-prime[i]-prime[j]为加数中最大的素数,避免了2 2 5和 2 5 2 重复这样的事发生
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <stack>
using namespace std;
typedef long long ll;
#define PI 3.1415926535897932
#define E 2.718281828459045
#define INF 0x3f3f3f3f
#define mod 1000000007
#define N 1000005
bool isprime[N];
ll prime[N];
int cnt;
void getpri() {
ll i;
int j;
cnt=0;
memset(isprime,false,sizeof(isprime));
for(i=2; i<1000000LL; i++)
{
if(!isprime[i])prime[cnt++]=i;
for(j=0; j<cnt&&prime[j]*i<1000000LL; j++)
{
isprime[i*prime[j]]=1;
if(i%prime[j]==0)break;
}
}
}
int main() {
int i,j,k,t;
getpri();
//printf("%I64d\n",prime[550]);
k=0;
for(i=0; i<1000; i++)
for(j=i+1; j<1000; j++)
{
sum[k++]=prime[i]+prime[j];
//has[sum[k-1]]=1;
}
//sort(sum,sum+k);
//for(i=0;i<100;i++)
//printf("%d\n",sum[i]);
t=k;
for(i=0; i<10000; i++)sum[k++]=3*prime[i];
//printf("%d\n",sum[i]);
//printf("%d %d\n",i,isprime[i]);
isprime[0]=isprime[1]=1;
while(scanf("%d",&n)!=EOF)
{
int cnt=0;
for(i=0; prime[i]<n; i++)
{
for(j=i; prime[j]<n; j++)
{
if(!isprime[n-prime[i]-prime[j]]&&(n-prime[i]-prime[j])>=prime[j]) cnt++;
}
}
printf("%d\n",cnt);
}
return 0;
}