hdu4713 Permutation(集合类型的dp,难-不拿手!!!)
#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 10001 using 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; }