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 integer
n(n≤10000)
.
Output
For each test case, print the number of ways.
Sample Input
3 9
Sample Output
0 2
<span style="font-size:14px;">#include<stdio.h>
#include<string.h>
#include<math.h>
const int Max=10000;
int prime[Max+10];
int cnt=0;
void prime_set(){
memset(prime,0,sizeof(prime));
for(int i=2;i<=10000;i++){
int flog=0;
int k=sqrt(i+0.5);
for(int j=2;j<=k;j++){
if(i%j==0)
flog=1;
}
if(!flog)
prime[cnt++]=i;
}
}
int find(int num){
int low=0,high=cnt-1;
while(low<=high){
int mid=(low+high)/2;
if(num==prime[mid])
return 1;
else if(num>prime[mid])
low=mid+1;
else high=mid-1;
}
if(low>high)
return 0;
}
int main(){
int n;
prime_set();
while(scanf("%d",&n)==1){
int ant=0;
for(int i=0;prime[i]<=n;i++){
for(int j=i;prime[j]<=n;j++){
if(n-prime[i]-prime[j]<prime[j])
break;
else if(find(n-prime[i]-prime[j]))
ant++;
}
}
printf("%d\n",ant);
}
return 0;
}
</span>
<span style="font-size:14px;">#include<stdio.h>
#include<string.h>
#include<math.h>
const int Max=10000;
int prime[Max+10];
int main(){
int n;
memset(prime,0,sizeof(prime));
prime[2]=1;
for(int i=3;i<=10000;i++){
int flog=0;
int k=sqrt(i+0.5);
for(int j=2;j<=k;j++){
if(i%j==0)
flog=1;
}
if(!flog)
prime[i]=1;
}
while(scanf("%d",&n)==1){
int cnt=0;
for(int i=2;i<=n;i++){
if(prime[i]){
for(int j=i;j<=n;j++){
if(prime[j]){
if(n-i-j<j)
break;
else if(prime[n-i-j])
cnt++;
}
}
}
}
printf("%d\n",cnt);
}
return 0;
}
</span>
void prime_set(){
long n;
int t;
memset(prime,0,sizeof(prime));
prime[0]=prime[1]=1;
for(int i=2;i<1000000000;i++){
if(prime[i]==0){
for(int j=i+i;j<Max;j+=i)
prime[j]=1;
}
}
}