Cod sursa(job #3316151)

Utilizator Dia3141Costea Diana Stefania Dia3141 Data 17 octombrie 2025 16:12:21
Problema Descompuneri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <fstream>
#include <unordered_map>
#include <algorithm>
#define nmax 5001
using namespace std;
ifstream cin("desc.in");
ofstream cout("desc.out");
long long n,v[nmax];
int m,k,dp[nmax][nmax];
unordered_map<int,long long>poz;
int main()
{
    cin>>n>>k;
    if(n==1){
        cout<<1<<'\n'<<1;
        return 0;
    }
    v[++m]=n;
    for(int d=2;1LL*d*d<=n;d++)
        if(n%d==0){
            v[++m]=d;
            if(1LL*d*d!=n)
                v[++m]=n/d;
        }
    sort(v+1,v+m+1);
    for(int i=1;i<=m;i++){
        dp[0][i]=1;
        poz[v[i]]=i;
    }
    for(int i=1;i<=m;i++){
        dp[i][i]=1;
        for(int j=i-1;j>0;j--){
            dp[i][j]=dp[i][j+1];
            if(v[i]%v[j]==0)
                dp[i][j]+=dp[poz[v[i]/v[j]]][j];/// se adauga numarul de posibilitati de a scrie pe v[i] ca v[j] * ( v[i] / v[j] )
        }
        dp[i][0]=dp[i][1];
    }
    cout<<dp[m][0]<<'\n';
    int i=1;
    while(n>1){
        for(;i<=m;i++){
            if(n%v[i]==0){
                if(k<=dp[poz[n/v[i]]][i]){
                    cout<<v[i]<<" ";
                    n/=v[i];
                    break;
                }
                k-=dp[poz[n/v[i]]][i];
            }
        }
    }
    return 0;
}
/// dp[i][j] = nr de moduri de a scrie pe v[i] ca produs de numere din v de la 1 la j