Primes Problem
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3455 Accepted Submission(s): 1558
Total Submission(s): 3455 Accepted Submission(s): 1558
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
首先将10000内的素数筛出来(约1000个),(p1,p2,p3)枚举三元组前两个p1,p2,可知若存在p3满足条件,必有p3=n−p1−p2,故令t=n−p1−p2。若t为不小于p2的素数,则t满足p3的条件。则答案加一
#include <bits/stdc++.h>
#define _ ios_base::sync_with_stdio(0);cin.tie(0);
using namespace std;
const int NP = 10005;
int ispri[NP] = {}, prime[NP], pcnt = 0;
void getprime()
{
ispri[0] = ispri[1] = 1;
for (long long i = 2; i < NP; i++)
if (ispri[i] == 0)
{
prime[++pcnt] = i;
for (long long j = i * i; j < NP; j += i)
{
ispri[j] = 1;
}
}
}
int judge(int x)
{
int gg = 1;
for (int i = 2; i <= (int)sqrt(x); i++)
{
if (x % i == 0)
{
gg = 0;
break;
}
}
return gg;
}
int main()
{
_
getprime();
int n;
while (cin >> n)
{
//clock_t start_time = clock();
int ans = 0;
for (int i = 1; i < pcnt; i++)
{
for (int j = i; j < pcnt; j++)
{
int p3 = n - prime[i] - prime[j];
if (p3 < 0)
{
break;
}
if (judge(p3) && p3 >= prime[j])
{
ans++;
}
}
}
cout << ans << endl;
//clock_t end_time = clock();
//cout << "Running time is: " << static_cast<double>(end_time - start_time) / CLOCKS_PER_SEC * 1000 << "ms" << endl;
}
return 0;
}