Cod sursa(job #1010412)

Utilizator stefanzzzStefan Popa stefanzzz Data 14 octombrie 2013 20:36:26
Problema Descompuneri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#define INF 1000000000000000000
#define MAXDIV 3000
using namespace std;
ifstream f("desc.in");
ofstream g("desc.out");

struct Comp2{
    bool operator()(pair<long long,int> a, pair<long long,int> b){
        return a.first<b.first;}};

long long n,k,x,y,S;
int pd[MAXDIV][MAXDIV],sum[MAXDIV][MAXDIV];
vector<long long> dvz;
set<pair<long long,int>,Comp2> s;
set<pair<long long,int>,Comp2>::iterator it;

bool Comp(long long a,long long b){
    return a>b;}

int main()
{
    long long i,j;
    f>>n>>k;
    dvz.push_back(INF);
    dvz.push_back(n);
    for(i=2;i*i<=n;i++)
        if(!(n%i)){
            dvz.push_back(i);
            if(i*i<n)
                dvz.push_back(n/i);}
    sort(dvz.begin(),dvz.end(),Comp);
    n=dvz.size()-1;
    for(i=1;i<=n;i++)
        s.insert(make_pair(dvz[i],i));
    for(i=n;i>=1;i--){
        pd[i][i]=1;
        sum[i][i]=1;
        for(j=i+1;j<=n;j++){
            if(dvz[i]%dvz[j]){
                pd[i][j]=0;
                sum[i][j]=sum[i][j-1];
                continue;}
            x=dvz[i]/dvz[j];
            it=s.find(make_pair(x,0));
            y=(*it).second;
            pd[i][j]=sum[y][j]-sum[y][y-1];
            if(pd[i][j]<0)
                pd[i][j]=0;
            sum[i][j]=sum[i][j-1]+pd[i][j];}}
    g<<sum[1][n]<<'\n';
    x=dvz[1];y=1;i=n;
    while(1){
        S=0;
        for(i;S<k;S+=pd[y][i],i--);
        i++;
        S-=pd[y][i];
        k-=S;
        g<<dvz[i]<<' ';
        x/=dvz[i];
        if(x==1)
            break;
        it=s.find(make_pair(x,0));
        y=(*it).second;}
    f.close();
    g.close();
    return 0;
}