Index of super-prime
time limit per test: 0.25 sec.
memory limit per test: 4096 KB
Let P1, P2, … ,PN, … be a sequence of prime numbers. Super-prime number is such a prime number that its current number in prime numbers sequence is a prime number too. For example, 3 is a super-prime number, but 7 is not. Index of super-prime for number is 0 iff it is impossible to present it as a sum of few (maybe one) super-prime numbers, and if such presentation exists, index is equal to minimal number of items in such presentation. Your task is to find index of super-prime for given numbers and find optimal presentation as a sum of super-primes.
Input
There is a positive integer number in input. Number is not more than 10000.
Output
Write index I for given number as the first number in line. Write I super-primes numbers that are items in optimal presentation for given number. Write these I numbers in order of non-increasing.
Sample Input
6
Sample Output
2 3 3
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int maxn = 1000;
int Q, Ps[maxn] = {0}, cnt = 0, snt = 0;
bool isprime(int p)
{
if(p == 2) return true;
if(p % 2 == 0)
return false;
for(int i = 3, j= 9; j <= p; i+=2, j = i*i)
{
if(p %i == 0) return false;
}
return true;
}
void init()
{
cin >> Q;
cnt = 1;
for(int i = 3; i <= Q; i++)
{
if(isprime(i))
{
cnt++;
if(isprime(cnt))
{
Ps[snt++] = i;
}
}
}
}
bool G[maxn * 10] = {0};
int F[maxn * 10] = {0};
int P[maxn * 10] = {0};
int DP(int x)
{
if(G[x]) return F[x];
G[x] = true;
for(int i = 0; i < snt; i++)
{
if(x >= Ps[i])
{
if(DP(x-Ps[i]) < F[x])
{
F[x] = F[x-Ps[i]];
P[x] = Ps[i];
}
}
}
F[x]++;
return F[x];
}
bool cmp(const int & x, const int & y)
{
return x > y;
}
void print(int x)
{
int ans[maxn], cnt = 0;
if(P[x] == 0) return;
while(x)
{
ans[cnt++] = P[x];
x -= P[x];
}
sort(ans, ans+cnt, cmp);
cout << ans[0];
for(int i = 1; i < cnt; i++)
cout << " " << ans[i];
}
int main()
{
init();
for(int i = 0; i <= Q; i++)
F[i]=~0U >> 3;
F[0] = 0; G[0] = true;
if(DP(Q) > 10000)
cout<< 0 << endl;
else
{
cout << DP(Q) << endl;
print(Q);
}
return 0;
}