Cod sursa(job #2396092)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 3 aprilie 2019 11:04:30
Problema Descompuneri Scor 4
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <cstdio>
#include <algorithm>
#include <map>
using namespace std;
long long di [1001],dp[101][101];
map <long long,int> f;
int elem=0;
int find_poz (int x){
    int st,dr,mid;
    st=1;
    dr=elem;
    while (st<=dr){
        mid=(st+dr)/2;
        if (di[mid]==x)
            return mid;
        else if (di[mid]<x)
            st=mid+1;
        else dr=mid-1;
    }
    return 0;
}
int main()
{
    FILE *fin=fopen ("desc.in","r");
    FILE *fout=fopen ("desc.out","w");
    int k,i;
    long long n,d,n2;
    fscanf (fin,"%lld",&n);
    fscanf (fin,"%d",&k);
    n2=n;
    d=2;
    while (d*d<=n2){
        if (n2%d==0){
            f[d]=1; /// d e unul dintre divizorii primi
            while (n2%d==0)
                n2/=d;
        }
        d++;
    }
    if (n2!=1){
        f[n2]=1; /// n2 e unul din divizorii primi
    }
    d=1;
    while (d*d<=n){
        if (n%d==0){
            di[++elem]=d;
            if (d!=n/d)
                di[++elem]=n/d;
        }
        d++;
    }
    /// maxim 2 * 10 ^ 6 divizori
    sort (di+1,di+elem+1);
    /// dp[i][j] = folosind divizori de la 1..i sa ai produsul j
    dp[1][1]=1;
    for (i=2;i<=elem;i++){
        //if (di[i]==4)
          //  printf ("a");
        dp[i][i]=1;
        for (int j=2;j<i;j++){
            if (di[i]%di[j]==0) /// adaugi un di[j] la di[i]/di[j]
                dp[i][j]+=dp[find_poz(di[i]/di[j])][j];
        }
        for (int j=1;j<=elem;j++)
            dp[i][j]+=dp[i][j-1];

    }
    fprintf (fout,"%lld\n",dp[elem][elem]);

    return 0;
}