Cod sursa(job #1804379)

Utilizator Bodo171Bogdan Pop Bodo171 Data 12 noiembrie 2016 15:14:43
Problema Descompuneri Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <iostream>
#include<fstream>
#include<vector>
using namespace std;
const int nmax=3005;
int modes[nmax][nmax],sum[nmax],tot;
int i,d,j,n,newd,cost,k,p,u,m,rasp;
long long curr,key,lst,prod,nr;
long long v[nmax],ans[nmax];
bool ok;
void finds()
{
     p=1;u=d;
     while(u-p>1)
     {
         m=(p+u)/2;
         if(v[m]<nr) p=m;
         else u=m;
     }
     if(v[u-1]==nr) u--;
     if(v[u]!=nr) u=d+1;
}
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)
        {
            nr=v[j]/v[i];
            finds();
            modes[i][j]+=sum[u];
        }
        sum[j]=sum[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];nr=prod;finds();curr=u;ok=0;
        ans[rasp]=v[lst];rasp++;
        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<rasp;i++)
        g<<ans[i]<<' ';
    return 0;
}