POJ3590 The shuffle Problem

#include<bits/stdc++.h>
using namespace std;
int poww(int a,int b)
{
    int c=1;
    while(b)
    {
        if(b&1) c=a*c;
        a=a*a;b>>=1;
    }
    return c;
}
int T,n,zs[110],t,ans[2][110][110],A[110];
bool isss[210];
int dfs(int u,int rst)
{
    if(ans[0][u][rst]!=-1) return ans[0][u][rst];
    if(rst==0||u>t) return ans[0][u][rst]=1;
    ans[0][u][rst]=dfs(u+1,rst);
    int tmp=1;
    for(int i=0;tmp<=rst;i++)
    {
        int us=tmp*dfs(u+1,rst-tmp);
        if(ans[0][u][rst]<us)
        {
            ans[0][u][rst]=us;
            ans[1][u][rst]=i;
        }
        tmp*=zs[u];
    }
    return ans[0][u][rst];
}
int main()
{
    memset(ans,-1,sizeof ans);
    for(int i=2;i<200;i++)
    {
        if(!isss[i]) zs[++t]=i;
        for(int j=1;j<=t;j++)
        {
            int tmp=zs[j]*i;
            if(tmp>=200) break;
            isss[tmp]=1;
            if(i%zs[j]==0) break;
        }
    }
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        dfs(1,n);
        printf("%d",ans[0][1][n]);
        int rst=n,u=1;
        multiset<int> st;
        for(int i=1;i<=t;i++)
        {
            if(ans[1][i][rst]==-1) continue;
            int us=poww(zs[i],ans[1][i][rst]);
            st.insert(us);
            rst-=us;
            if(rst==0) break;
        }
        while(rst--) st.insert(1);
        while(!st.empty())
        {
            int nw=*st.begin();
            st.erase(st.begin());
            for(int i=1;i<nw;i++) printf("% d",u+i);
            printf("% d",u);
            u+=nw;
        }
        puts("");
    }
}

 

posted @ 2020-02-06 17:05  Cduiz  阅读(113)  评论(0)    收藏  举报