Cod sursa(job #778566)

Utilizator ionut_blesneagIonut Blesneag ionut_blesneag Data 15 august 2012 00:08:56
Problema Descompuneri Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include<fstream>
#include<algorithm>
using namespace std;

ifstream f("desc.in");
ofstream g("desc.out");

struct comp
{bool operator()(const int &a, const int &b) const
   {
   return (a<b);
   }
};

long long n,i,j,c,imax;
int k,nrdiv,nrpoz,sqrtnr;
long long v[3001];
int poz[1000001];
long long complem;
long long produs;
int m[3001][3001];

int pozitie(long long val)
{
if(val==n)
  return nrdiv;
if(val<imax)
  return poz[val];
complem=n/val;
return (nrdiv-poz[complem]);    
}

int main()
{f>>n>>k;

nrpoz=0;
for(i=2; i*i<=n; i++)
  if(n%i==0)
  {nrdiv++;  nrpoz++;  v[nrdiv]=i;   poz[i]=nrpoz;
   if(i*i!=n)
      {nrdiv++;  v[nrdiv]=n/i;}
   else
     sqrtnr=1;   
   }  
imax=i;   
nrdiv++;  
v[nrdiv]=n;

sort(v+1, v+nrdiv+1, comp());     

for(i=1; i<=nrdiv; i++)
  m[i][i]=1;
    

for(i=2; i<=nrdiv; i++)
  for(j=i-1; j>=1; j--)
    {m[i][j]=m[i][j+1];
     if(v[i]%v[j]==0)
     {c=v[i]/v[j];
      m[i][j]+=m[pozitie(c)][j];
      }
    }
          
/*for(i=1; i<=nrdiv; i++)
 {for(j=1; j<=nrdiv; j++)
   g<<m[i][j]<<" ";
 g<<endl;}  */

g<<m[nrdiv][1]<<endl;

i=nrdiv;
j=1;
produs=1;
while(produs!=n)
{if(m[i][j]-m[i][j+1]<k)
   {k=k-m[i][j]+m[i][j+1];
    j++;}
 else
   {
    g<<v[j]<<" ";
    produs*=v[j];
    c=v[i]/v[j];
    i=pozitie(c);}     
}
 
f.close();
g.close();
return 0;}