Cod sursa(job #73226)

Utilizator moga_florianFlorian MOGA moga_florian Data 17 iulie 2007 14:48:19
Problema Descompuneri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
using namespace std;
#include<fstream>
#include<math.h>
#define Dmax 3000

ifstream fin("desc.in");
ofstream fout("desc.out");     

long long diviz[Dmax],D[Dmax];
int frecv[Dmax],Nd,ND=0;
int A[Dmax][Dmax];

void back(int i,long long Dnou)
{
if(i>Nd)
   {
   if(Dnou>1)
     D[++ND]=Dnou;
   return;
   }
   
int k;
long long par=Dnou;

back(i+1,par);
for(k=1;k<=frecv[i];k++)
   {
   par*= diviz[i];
   back(i+1, par);     
   }
}

int main()
{
long long N,p,V,X;
int K,i,j,k;

fin>>N>>K;
V=N;

//aflare factori
if(V%2==0)
  {
  Nd=1;
  diviz[1]=2;
  frecv[1]=0;
  while(V%2==0)
     {
     frecv[1]++;
     V>>=1;
     }
  }
else
  Nd=0;

for(p=3;p<= (long long)sqrt((double)V); p+=2)
  if(V%p==0)
   {
   Nd++;
   diviz[Nd]=p;
   frecv[Nd]=0;
   
   while(V%p==0)
     {
     V/=p;
     frecv[Nd]++;           
     }      
   }   
if(V>1)
   {
   diviz[++Nd]=V;
   frecv[Nd]=1;    
   }

back(1,1);   

//sort
for(i=1;i<=ND;i++)
  {
  j=i;
  while(j/2 && D[j/2] < D[j])
     {
     D[j/2]^=D[j], D[j]^=D[j/2], D[j/2]^=D[j];
     j>>=1;       
     }                
  }
i=ND;
while(i>1)
  {
  D[1]^=D[i], D[i]^=D[1], D[1]^=D[i];
  --i;
  
  j=1;
  while(1) 
    {
    k=j<<1;
    if(k>i) break;
    if(k+1<=i && D[k+1] > D[k]) k++;
    if(D[j] > D[k]) break;
    
    D[j]^=D[k], D[k]^=D[j], D[j]^=D[k];
    j=k;   
    }        
  }

D[0]=1;
for(i=1;i<=ND;i++) A[0][i]=1;

for(j=ND;j;j--)
  {
  k=0;
  for(i=j;i<=ND;i++)
     {
     A[i][j]= A[i][j+1];
     
     if(D[i] % D[j] == 0)
        {
        X=D[i]/D[j];
        while(D[k] < X) k++;
        
        A[i][j]+= A[k][j];
        }
     }
  }
       
fout<<A[ND][1]<<"\n";

X=N;
for(i=1;i<=ND;i++)
 if(X%D[i] == 0)
  {
  V=X/D[i];
  k=0;
  while(D[k]<V) k++;
  
  if(A[k][i] < K)
     K-=A[k][i];
  else
     {
     fout<<D[i]<<" ";
     X=V;                             
     i--;
     }
  }
   
fin.close();
fout.close();
return 0;
}