Cod sursa(job #778657)

Utilizator ionut_blesneagIonut Blesneag ionut_blesneag Data 15 august 2012 12:58:01
Problema Descompuneri Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;

vector<long long> v;
vector<long long>::iterator jt;
long long n,i;
int k,sqrtn,nrdiv,j,u,t;
int m[3001][3001];


int main()
{freopen("desc.in","r",stdin);
freopen("desc.out","w",stdout);
scanf("%d %d",&n,&k);
sqrtn=(int)sqrt((double)n);
for(i=2; i<sqrtn; i++)
{if(n%i==0)
 {v.push_back(i);
  v.push_back(n/i);}
}

if(n%sqrtn==0)
 {v.push_back(sqrtn);
  if(int(n/sqrtn)!=sqrtn)
    v.push_back(n/sqrtn);
}  
v.push_back(n);

nrdiv=v.size();
sort(v.begin(),v.end());
/*for(j=0; j<nrdiv; j++)
  g<<v[j]<<" ";  */

m[0][0]=1;  
for(u=1; u<nrdiv; u++)
 {m[u][u]=1;
  for(j=u-1; j>=0; j--)
  {m[u][j]=m[u][j+1];
   if(v[u]%v[j]==0)
   {t=0;
    while(v[t]<v[u]/v[j])  t++;
    m[u][j]+=m[t][j];}
   }
}   

/*for(u=0; u<nrdiv; u++)
 {for(j=0; j<nrdiv; j++)
  g<<m[u][j]<<" ";
 g<<endl;}  */
 
printf("%d\n",m[nrdiv-1][0]); 

u=nrdiv-1; 
j=0;
while(n>1)
{
if(m[u][j]-m[u][j+1]<k)
  {k=k-m[u][j]+m[u][j+1];
   j++;}
else
 {printf("%d ",v[j]);
  n=n/v[j];
  if(n!=1)
   while(v[u]>n)  u--; 
  }           
}
     
return 0;
}