Cod sursa(job #2471566)

Utilizator darkkcyanTran Quang Loc darkkcyan Data 11 octombrie 2019 09:23:37
Problema Descompuneri Scor 0
Compilator cpp-32 Status done
Runda Arhiva de probleme Marime 2.3 kb
#include <bits/stdc++.h>
using namespace std;
using namespace std::placeholders;

#define llong long long 
#define xx first
#define yy second
#define len(x) ((int)x.size())
#define rep(i,n) for (int i = -1; ++ i < n; )
#define rep1(i,n) for (int i = 0; i ++ < n; )
#define all(x) x.begin(), x.end()
// #define rand __rand
// mt19937 rng(chrono::system_clock::now().time_since_epoch().count());  // or mt19937_64
// template<class T = int> T rand(T range = numeric_limits<T>::max()) {
    // return (T)(rng() % range);
// }


#define maxdiv 5050

vector<llong> get_divisors(llong num) {
    vector<llong> u, v;
    for (llong i = 1; i * i <= num; ++i) {
        if (num % i) continue;
        u.push_back(i);
        if (i * i != num)
            v.push_back(num / i);
    }
    u.insert(u.end(), v.rbegin(), v.rend());
    return u;
}

int main(void) {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    llong n, k;
    cin >> n >> k;
    auto divisors = get_divisors(n);
    int cnt_div = len(divisors);

    assert(cnt_div <= 10000);

    vector<vector<int>> div_res(cnt_div, vector<int>(cnt_div + 10, -1));
    vector<vector<llong>> dp(cnt_div, vector<llong>(cnt_div + 10, 0));

    rep(i, cnt_div) {
        int v = i;
        rep(u, i + 1) {
            if (divisors[i] % divisors[u]) continue;
            while (v >= 0 and divisors[i] != divisors[u] * divisors[v]) --v;
            if (u > v) break;
            div_res[i][u] = v;
            div_res[i][v] = u;
        }
    }

    // rep1(base, cnt_div - 1) {
        // dp[base][base] = 1;
        // for (int start = base; start--; ) {
            // dp[base][start] = dp[base][start + 1];
            // if (div_res[base][start] == -1) continue;
            // dp[base][start] += dp[div_res[base][start]][start];
        // }
    // }
// 
    // cout << dp[cnt_div - 1][1] << '\n';
// 
    // int prev = 1;
    // for (int num = cnt_div - 1; num > 0; ) {
        // for (int i = prev; i < cnt_div; ++i) {
            // if (div_res[num][i] == -1) continue;
            // llong cnt = dp[num][i] - dp[num][i + 1];
            // if (k > cnt) k -= cnt;
            // else {
                // cout << divisors[i] << ' ';
                // num = div_res[num][i];
                // prev = i;
                // break;
            // }
        // }
// 
    // }
// 
    return 0;
}