Cod sursa(job #1733003)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 23 iulie 2016 14:01:31
Problema Descompuneri Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <cstdio>
#define MOD 666019
#define MAXU 1000000
#define MAXS 39
long long val[MAXU+1], ans[MAXU+1], s[MAXS+1];
int u, next[MAXU+1], lista[MOD+1];
long long desc(long long n, int d){
    long long a=(n<<21)+d;
    int b=a%MOD;
    int p=lista[b];
    while((p)&&(val[p]!=a)) p=next[p];
    if(p) return ans[p];
    long long rez=1;
    while((d*(long long)d<=n)&&(n%d!=0)) d++;
    if(d*(long long)d<=n) rez=desc(n/d, d)+desc(n, d+1);
    u++;
    val[u]=a;
    ans[u]=rez;
    next[u]=lista[b];
    lista[b]=u;
    return rez;
}
int main(){
    int k, i, d;
    long long n;
    FILE *fin, *fout;
    fin=fopen("desc.in", "r");
    fout=fopen("desc.out", "w");
    fscanf(fin, "%lld%d", &n, &k);
    fprintf(fout, "%lld\n", desc(n, 2));
    d=2;
    while((d*(long long)d<=n)&&(n%d!=0)) d++;
    while(d*(long long)d<=n){
        if(desc(n/d, d)<k){
            k-=desc(n/d, d);
            d++;
        }else s[++s[0]]=d, n/=d;
        while((d*(long long)d<=n)&&(n%d!=0)) d++;
    }
    s[++s[0]]=n;
    for(i=1; i<=s[0]; i++) fprintf(fout, "%lld ", s[i]);
    fclose(fin);
    fclose(fout);
    return 0;
}