hdu4713 Permutation(集合类型的dp,难-不拿手!!!)
来源:互联网 发布:淘宝双11报名条件 编辑:程序博客网 时间:2024/06/05 20:46
#include<cstdlib>#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<set>#include<map>#include<list>#include<queue>#include<vector>#define tree int o,int l,int r#define lson o<<1,l,mid#define rson o<<1|1,mid+1,r#define lo o<<1#define ro o<<1|1#define ULL unsigned long long#define LL long long#define inf 0x7fffffff#define eps 1e-7#define N 10001using namespace std;int m,n,T,t,x,y,u;bool vis[N];int p[N],pn;vector<int>g[N];double d[N];int ans[N];void init(){ for(int i=2; i<N; i++) { if(!vis[i]) { p[pn++]=i; for(int j=i*i; j<N; j+=i) vis[j]=1; } } for(int i=0; i<pn; i++) { for(int j=N-1; j>=p[i]; j--) { double tp=log2(p[i]); for(int k=p[i],num=1; k<=j; k*=p[i],num++) if(d[j]<d[j-k]+tp*num) { d[j]=d[j-k]+tp*num; g[j]=g[j-k]; g[j].push_back(k); } } }}int main(){#ifndef ONLINE_JUDGE freopen("ex.in","r",stdin);#endif init(); scanf("%d",&T); while(T--) { scanf("%d",&n); int sum=0,m=0; for(int i=0; i<g[n].size(); i++) { sum+=g[n][i]; ans[m++]=g[n][i]; } for(int i=sum; i<n; i++) ans[m++]=1; sort(ans,ans+m); int f=0,t=1; for(int i=0; i<m; i++) { for(int j=0; j<ans[i]-1; j++) { if(f)putchar(' '); printf("%d",t+j+1); f=1; } if(f)putchar(' '); printf("%d",t); f=1; t+=ans[i]; } puts(""); } return 0;}