没什么好说的了,卡了半天居然是输出结果的时候顺序输反了,真心给跪啊。
上来一个素数筛法,比较快能把素数找出来,然后找超级素数。
接着就广搜一下,至此预处理完毕。
输入k的时候只要无节操的查下就OK。
废话少说,上代码!
//SGU 116 Index of super-prime
//素数筛法+背包|BFS
//by night_watcher
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
#define N 10001
bool isprime[N];
int prime[N];
int pcnt;
int cnt[N];
int sup[N];
int to[N];
int get[N];
int supcnt;
void findprime(){
int i,j,k=2;
for(k=2;k<N;k++){
if(isprime[k]){
prime[++pcnt]=k;
for(i=2*k;i<=N-1;i+=k){
isprime[i]=0;
}
}
}
for(i=1,j=prime[prime[1]];prime[i]<=pcnt;j=prime[prime[++i]]){
sup[supcnt++]=j;
}
return ;
}
void bfs(){
int i,j;
queue<int> q;
while(!q.empty()) q.pop();
for(i=0;i<supcnt;i++){
cnt[sup[i]]=1;
to[sup[i]]=-1;
get[sup[i]]=sup[i];
q.push(sup[i]);
}
while(!q.empty()){
int f = q.front();
q.pop();
for(i=0;i<supcnt&&f+sup[i]<N;i++){
if(cnt[f+sup[i]]==-1){
cnt[f+sup[i]]=cnt[f]+1;
q.push(f+sup[i]);
to[f+sup[i]]=f;
get[f+sup[i]]=sup[i];
}
}
}
return ;
}
bool cmp(const int a,const int b){
return a>b;
}
void find(int k){
vector<int> v;
v.clear();
int i;
for(i=k;i!=-1;i=to[i]){
v.push_back(get[i]);
}
sort(v.begin(),v.end(),cmp);
cout<<v[0];
for(i=1;i<v.size();i++){
cout<<" "<<v[i];
}
cout<<endl;
}
int main(){
int i,j,k;
memset(isprime,1,sizeof(isprime));
memset(cnt,-1,sizeof(cnt));
pcnt=supcnt=0;
findprime();
bfs();
while(cin>>k){//
if(k<0||k>=N||cnt[k]==-1){
cout<<0<<endl;
}
else{
cout<<cnt[k]<<endl;
find(k);
}
}
return 0;
}