Cod sursa(job #21226)

Utilizator diaDiana Adrisor dia Data 22 februarie 2007 23:37:18
Problema Descompuneri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <stdio.h>
#include <math.h>
#include <vector>
#include <algorithm>
#include <string.h>
#define NMAX 4020

using namespace std;

long long A[NMAX][NMAX], N, Sol[NMAX];
int K, M;
vector<long long> D;

int cb(long long x)
{
        int lo, hi, mid;

        for (lo = 0, hi = M, mid = (lo+hi)/2; lo <= hi; mid = (lo+hi)/2)
        {
                if (x == D[mid]) return mid;
                if (x < D[mid]) hi = mid-1;
                else lo = mid+1;
        }
        return -1;
}

int main()
{
        int i, j, rad, p, nsol = 0, t;
        long long ii;

        freopen("desc.in", "r", stdin);
        scanf("%lld %d", &N, &K);

        D.clear();
        memset(A, 0, sizeof(A));
        D.push_back(1);
        for (ii = 2; ii*ii <= N; ii++)
            if (N%ii == 0) {D.push_back(ii);
            if (N/ii != i) D.push_back(N/ii); }

        D.push_back(N);
        sort(D.begin(), D.end());
        M = D.size();

        for (i = 0; i < M; i++) A[0][i] = 1;

        for (i = 1; i < M; i++)
            {
                for (j = i; j > 0; j--)
                {
                    A[i][j] = A[i][j+1];
                    p = -1;
                    if (D[i]%D[j] == 0)
                       p = cb(D[i]/D[j]);
                    if (p >= 0) A[i][j] += A[p][j];
                }
            }

        freopen("desc.out", "w", stdout);
        printf("%d\n", A[M-1][1]);

        return 0;
        
}