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;}

原创粉丝点击