Cod sursa(job #164766)

Utilizator DorinOltean Dorin Dorin Data 24 martie 2008 19:47:38
Problema Descompuneri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
//#include <cstdio>
#include <fstream>
#include <vector>
//#include <algorithm>

# define input "desc.in"
# define output "desc.out"

using namespace std;

# define max 5001

long long a[max],b[max];
long long i,j,n,nr,k,d,c,p;
vector <vector <long long> > f;

int main()
{
    ifstream fin ( input );
    ofstream fout ( output );
    
    fin >> n >> p;
    
    f.resize(max);
    
    for(i=2;i*i<=n;i++)
       if(n%i == 0)
       {
              a[++d] = i;
              b[d] = n/i;
       }
       i=d;
    if(a[d] * a[d] == n) i--;
    for(;i;i--)
       a[++d] = b[i];
    a[++d] = n;
    
    f[0].resize(d+2);
    
    for(i=1;i<=d;i++)
        f[0][i]=1;
        
    a[0] = 1;
        
    for(i=1;i<=d;i++)
    {
        f[i].resize(i+2);
        k=0;
        for(j=i;j;j--)
        {
           f[i][j] = f[i][j+1];
		   if(a[i] % a[j] == 0)
           {
                   c = a[i]/a[j];
                   while(c != a[k]) k++;
                   
                   if(!k)
                      f[i][j] += f[k][j];
                   else
                    if(k >= j)
                       f[i][j] += f[k][j];
           }
        }
	}

	fout << f[d][1];

	int pos = 1;
	nr = 0;

	while(n!=1)
	{
		if(n%a[pos] == 0)
		{
		 c = n/a[pos];
		 k = 0;
		 while(a[k] != c) k++;
		 if(pos <= k || k == 0)
			if(f[k][pos] < p)
			   p-=f[k][pos],pos++;
			else
			{
			   b[++nr] = a[pos];
			   n/=a[pos];
			}
		 else
			pos++;
		}
		else
			pos++;
	}
	fout << "\n";

	for ( i=1;i<=nr;i++)
		fout << b[i] << " ";

	return 0;
}