Cod sursa(job #470043)

Utilizator andrei.dAndrei Diaconeasa andrei.d Data 10 iulie 2010 23:18:55
Problema Descompuneri Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <cmath>

using namespace std;

#define file_in "desc.in"
#define file_out "desc.out"

#define nmax 3000

int k,nrd;
long long n;
long long d[nmax];
int a[nmax][nmax];

void citire()
{
    freopen(file_in,"r",stdin);
    freopen(file_out,"w",stdout);

    scanf("%lld %d", &n, &k);

}


int cauta(long long x)
{
    int i,step;

    for (step=1;step<=nrd;step<<=1);
        for (i=0;step;step>>=1)
        if (i+step<=nrd && d[i+step]<=x)
            i+=step;
    return i;
}


void solve()
{
    long long i;
    int j,poz,k;
    nrd=0;
    for (i=1;i*i<n;++i)
          if (n%i==0)
             {
                 d[++nrd]=n/i;
                 d[++nrd]=i;
             }
      if (i*i==n)
          d[++nrd]=i;



          sort(d+1,d+nrd+1);

      // printf("%d\n", nrd);
      //for (i=1;i<=nrd;++i)
        //     printf("%lld ", d[i]);

    for (i=2;i<=nrd;++i)
     {
         for (j=2;j<=i;++j)
          {
              a[i][j]=a[i][j-1];
              if (d[i]%d[j]) continue;
              poz=cauta(d[i]/d[j]);
              if (j<=poz)
              a[i][j]+=a[poz][poz]-a[poz][j-1];
          }
         a[i][i]=a[i][i-1]+1;
     }
     printf("%d\n", a[nrd][nrd]);
}

int main()
{
    citire();
    solve();

    fclose(stdin);
    fclose(stdout);

    return 0;
}