Cod sursa(job #2396532)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 3 aprilie 2019 16:40:02
Problema Descompuneri Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <cstdio>
#include <algorithm>
#include <map>
using namespace std;
long long di [101],dp[101][101];
int elem=0;
int find_poz (long long x){
    int st,dr,mid;
    st=1;
    dr=elem;
    while (st<=dr){
        mid=(st+dr)/2;
        if (di[mid]==x)
            return mid;
        else if (di[mid]<x)
            st=mid+1;
        else dr=mid-1;
    }
    return 0;
}
int main()
{
    FILE *fin=fopen ("desc.in","r");
    FILE *fout=fopen ("desc.out","w");
    int k,i,j,last;
    long long n,d,sum,x;
    fscanf (fin,"%lld",&n);
    fscanf (fin,"%d",&k);
    d=1;
    while (d*d<=n){
        if (n%d==0){
            di[++elem]=d;
            if (d!=n/d)
                di[++elem]=n/d;
        }
        d++;
    }
    /// maxim 2 * 10 ^ 6 divizori
    sort (di+1,di+elem+1);
    /// dp[i][j] = folosind divizori de la j..elem sa ai produsul i
    dp[1][1]=1;
    for (i=1;i<=elem;i++){
        dp[i][i]=1;
        for (j=i-1;j>=2;j--){
            if (di[i]%di[j]==0) /// adaugi un di[j] la di[i]/di[j]
                dp[i][j]+=dp[find_poz(di[i]/di[j])][j];
        }
        for (j=elem-1;j;j--)
          dp[i][j]+=dp[i][j+1];
        //printf ("%lld %lld\n",di[i],dp[i][1]);
    }
    fprintf (fout,"%lld\n",dp[elem][1]);
    sum=0;
    last=2;
    while (n!=1){
        //if (n==4)
          //  printf ("a");
        for (i=last;i<=elem;i++){
            if (n%di[i]==0){
                if (n==di[i]){
                    fprintf (fout,"%lld ",n);
                    return 0;
                }
                sum=sum+(dp[find_poz(n/di[i])][i]);
            }
            if (sum>=k){
                fprintf (fout,"%lld ",di[i]);
                last=i;
                k=k-(sum-dp[find_poz(n/di[i])][i]);
                sum=0;
                n/=di[i];
                break;
            }
        }
    }
    return 0;
}