Cod sursa(job #2578580)

Utilizator robert.barbu27robert barbu robert.barbu27 Data 11 martie 2020 11:59:48
Problema Descompuneri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ifstream f("desc.in");
ofstream g("desc.out");
ll n,k,dp[4095][4095];
vector<pair <ll ,ll> > divizori[4095];
vector<ll> diviz;


void perechidiv(int i)
{
    int l=1,r=i;
    ll val=diviz[i];


    while(l<=r)
    {
        if(1LL*diviz[l]*diviz[r]==val) {divizori[i].push_back({l,r});l++;r--;}
        else
        {
            if(1LL*diviz[l]*diviz[r]>val) r--;
            else l++;
        }
    }
    divizori[i].push_back({i,0});


}
void faperm(int divcurent,int lastdiv,ll k)
{

  if(lastdiv==0) return;
  if(lastdiv!=-1) g<<diviz[lastdiv]<<" ";

    int m=divizori[divcurent].size();

    ll cnt=0,copiecnt,rasp;

    for(int i=0;i<m;i++)
    {
        if(divizori[divcurent][i].first>=lastdiv)
        {
            cnt=dp[divcurent][divizori[divcurent][i].first];
            if(cnt>=k) {faperm(divizori[divcurent][i].second,divizori[divcurent][i].first,k);break;}
            else
            {
                k-=cnt;

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

for(int i=1;1LL*i*i<=n;i++)
{
    if(n%i==0)
    {
        if(n/i!=i)
        {
            diviz.push_back(i);
            diviz.push_back(n/i);
        }
        else
            diviz.push_back(i);
    }
}

sort(diviz.begin(),diviz.end());
int z=diviz.size();
for(int i=0;i<z;i++)
{
    perechidiv(i);
    dp[i][i]=1;

}
dp[0][0]=1;
//int z=diviz.size();
for(int i=1;i<z;i++)
{ll sol=0;
//cout<<diviz[i]<<" ";
int m=divizori[i].size();
    for(int j=0;j<m;j++)
    {///calculcam dp[i][x];

            ll val=divizori[i][j].second;
            int x=divizori[i][j].first;
            int cnt=divizori[val].size();
            if(val!=0){
            for(int d=cnt-1;d>=0;d--)
            {
                if(divizori[val][d].first>=x)
                {
                    dp[i][x]+=dp[val][divizori[val][d].first];
                }
            }
            }

         sol+=dp[i][x];


    }
    if(i==z-1){
  g<<sol<<'\n';

    }
}

faperm(diviz.size()-1,-1,k);

}