Cod sursa(job #1804336)

Utilizator Bodo171Bogdan Pop Bodo171 Data 12 noiembrie 2016 14:38:17
Problema Descompuneri Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <iostream>
#include<fstream>
#include<vector>
using namespace std;
const int nmax=(1<<12);
vector<long long> ans;
int modes[nmax][nmax],sum[nmax][nmax],tot;
int i,d,j,n,newd,cost,k,p,u,m;
long long curr,key,lst,prod;
long long v[nmax];
bool ok;
int finds(long long x)
{
     p=1;u=d;
     while(u-p>1)
     {
         m=(p+u)/2;
         if(v[m]<x) p=m;
         else u=m;
     }
     if(v[u-1]==x) u--;
     if(v[u]!=x) return d+1;
     return u;
}
int main()
{
    ifstream f("desc.in");
    ofstream g("desc.out");
    f>>n>>k;
    for(i=2;i*i<=n;i++)
    {
        d++;
        v[d]=i;
    }
    for(i=d;i>=1;i--)
    {
        if((n/v[i])!=v[i])
        {newd++;v[d+newd]=n/v[i];}
    }
    d+=newd;
    d++;
    v[d]=n;
    for(i=1;i<=d;i++)
        modes[i][i]=1;
    for(i=d;i>=1;i--)
        for(j=1;j<=d;j++)
    {
       if(v[j]%v[i]==0)
        {
            modes[i][j]+=sum[i][finds(v[j]/v[i])];
        }
        sum[i][j]=sum[i+1][j]+modes[i][j];
    }
    for(i=1;i<=d;i++)
        tot+=modes[i][d];
    lst=0;v[0]=1;prod=n;
    while(prod!=1)
    {
        prod/=v[lst];curr=finds(prod);ok=0;
        ans.push_back(v[lst]);
        if(prod==1) break;
        if(lst==0) lst=1;
        for(i=lst;i<=d&&ok==0;i++)
        {
            if(prod%v[i]==0)
            {
                if(cost+modes[i][curr]>=k)
                {
                    ok=1;lst=i;
                }else cost+=modes[i][curr];
            }
        }
    }
    g<<tot<<'\n';
    for(i=1;i<ans.size();i++)
        g<<ans[i]<<' ';
    return 0;
}