Cod sursa(job #1765027)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 26 septembrie 2016 10:49:42
Problema Descompuneri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <cstdio>
#include <cmath>
#define MAXDIV 5000
#define MAXSQRT 1000000
int dp[MAXDIV+1][MAXDIV+1];
long long div[MAXDIV*3];
char vf[MAXSQRT+1];
int main(){
    FILE*fi,*fout;
    int x,m,i,j,k,poz,flag;
    long long n,d;
    fi=fopen("desc.in" ,"r");
    fout=fopen("desc.out" ,"w");
    fscanf(fi,"%lld %d " ,&n,&k);
    d=2;
    x=sqrt(n);
    m=0;
    while(d<=x){
        if(n%d==0){
            div[++m]=d;
            vf[d]=1;
        }
        d++;
    }
    d--;
    if(d*d==n)
        d--;
    while(d>1){
        if(vf[d]==1)
            div[++m]=n/d;
        d--;
    }
    div[++m]=n;
    div[0]=1;
//  for(i=0;i<=m;i++)
    //  printf("%lld " ,div[i]);
    for(i=1; i<=m; i++)
        dp[0][i]=1;
    for(i=1; i<=m; i++){
        poz=0;
        for(j=m; j>=1; j--){
            d=div[i]/div[j];
            dp[i][j]=dp[i][j+1];
            if(d*div[j]==div[i]){
                while(poz<=m&&div[poz]<d)
                    poz++;
                if(div[poz]==d)
                    dp[i][j]+=dp[poz][j];
            }
        }
    }
    fprintf(fout,"%d\n" ,dp[m][1]);
    i=1;
    poz=m;
    while(n>1){
          if(n%div[i]==0){
              d=n/div[i];
              while(poz>=0&&div[poz]>d)
                 poz--;
              if(k>dp[poz][i]){
                 k-=dp[poz][i];
                 i++;
              }
              else{
                 fprintf(fout,"%lld " ,div[i]);
                 n/=div[i];
              }
         }
         else
            i++;
    }
    fclose(fi);
    fclose(fout);
    return 0;
}