Cod sursa(job #2774656)

Utilizator hurjui12AlexandruHurjui Alexandru-Mihai hurjui12Alexandru Data 12 septembrie 2021 10:32:38
Problema Descompuneri Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;

ifstream fin ("desc.in");
ofstream fout ("desc.out");

long long d[10001], dp[10001];

int cb (long long val)
{
    int st = 1, dr = d[0], mij;
    while (st <= dr)
    {
        mij = (st+dr)>>1;
        if (d[mij] == val)
            return mij;
        if (d[mij] < val)
            st = mij + 1;
        else
            dr = mij - 1;
    }
    return -1;
}

void calc_dp (int is, long long n)
{
    int i, j, poz;
    for (i = 1; i<=d[0]; i++)
        dp[i] = 0;
    dp[1] = 1;
    for (i = d[0]; i>=is; i--)
        for (j = 1; j<=d[0] && n/d[j] >= d[i]; j++)
        {
            poz = cb (d[i] * d[j]);
            if (poz != -1)
                dp[poz] += dp[j];
        }
}

void sterge_dp (int is)
{
    int i, poz;
    for (i = d[0]; i>=1; i--)
        if (d[i] % d[is] == 0)
        {
            poz = cb (d[i] / d[is]);
            dp[i] = dp[i] - dp[poz];
        }
}

void pune_dp (int is)
{
    int j, poz;
    for (j = 1; j<=d[0] && d[0]/d[j] >= d[is]; j++)
    {
        poz = cb (d[is] * d[j]);
        if (poz != -1)
            dp[poz] += dp[j];
    }
}

int main()
{
    long long n, k, nr;
    int i, j;

    fin >> n >> k;
    for (i = 1; 1ll*i*i < n; i++)
        if (n % i == 0)
        {
            d[++d[0]] = i;
            d[++d[0]] = n/i;
        }

    if (1ll * i * i == n)
        d[++d[0]] = i;

    sort(d+1, d+d[0]+1);

    calc_dp (2, n);
    fout << dp[d[0]] << '\n';

    return 0;

    k--;
    i = 2;
    while (n > 1)
    {
        nr = dp[cb(n)];
        sterge_dp (i);
        nr = nr - dp[cb(n)];

        if (k >= nr)
        {
            i++;
            k = k - nr;
        }
        else
        {
            fout << i << ' ';
            pune_dp(i);
            n = n / i;
        }
    }
    return 0;
}