Cod sursa(job #53703)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 22 aprilie 2007 21:50:42
Problema Descompuneri Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <stdio.h>

#define maxn 2048
#define ll long long 

ll n;
int m,l,k;
int c[maxn][maxn],sum[maxn][maxn];
ll a[maxn];
int sol[maxn];

int search(int x)
{
    int front=1,middle,back=l,aux=0;
    
    while (front<=back)
    {
          middle=(front+back)/2;
          
          if (a[middle]>=x)
          {
              aux=middle;
              back=middle-1;
          }
          else front=middle+1;
    }
    
    return aux;
}

int main()
{
    freopen("desc.in","r",stdin);
    freopen("desc.out","w",stdout);
    
    scanf("%lld %d",&n,&m);
    
    int i,aux,j,x;
    
    for (i=1;1LL*i*i<=n;i++) 
      if (n%i==0) a[++l]=i;
      
    if (a[l]*a[l]==n) aux=l-1;
    else aux=l;
    
    for (i=aux;i>0;i--) a[++l]=n/a[i];
    
    if (l>=maxn) return 0;
    
    c[l][l]=1;
    for (i=2;i<=l;i++) sum[l][i]=1;
            
    for (i=l-1;i>0;i--) 
      for (j=l;j>1;j--) 
      {
        sum[i][j]=sum[i][j+1];
        if (n%(a[i]*a[j])==0)
        {
            x=search(a[i]*a[j]);
            if (x>j) c[i][j]=sum[x][j];
            else c[i][j]=sum[x][x];            
            
            sum[i][j]+=c[i][j];
        }
      }
                
    printf("%d\n",sum[1][2]);
    
    x=1;
    while (x<l) 
    {
        for (i=sol[k];i<=l;i++)
          if (c[x][i]<m) m-=c[x][i];
          else {
                   sol[++k]=i;
                   x=search(a[x]*a[i]);
                   break;
               }
        
    }
    
    for (i=1;i<=k;i++) printf("%d ",a[sol[i]]);
    printf("\n");
    
    return 0;
}