Submission #483233

#TimeUsernameProblemLanguageResultExecution timeMemory
483233MonarchuwuToys (CEOI18_toy)C++17
100 / 100
2055 ms86728 KiB
/**
 *  - x món 1, y món 2, z món 3 thì số cách chọn là (x + 1) * (y + 1) * (z + 1)
 *    => phân tích n thành tsnt, đặt s[i] là tập số lượng đồ chơi có thể chia thỏa trong i ngày
 *  - dp[i] += (dp[i / k] + k-1) (số món tăng k-1) (k là ước > 1 của i)
**/
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
int n;

vector<int> divisor(int n) {
    vector<int> div(1, n);
    for (int i = 2; i * i <= n; ++i) if (n % i == 0) {
        div.push_back(i);
        if (i * i != n) div.push_back(n / i);
    }
    return div;
}

map<int, set<int>> mp;
void calc(int n) {
    vector<int> div = divisor(n);
    for (int k : div) {
        if (!mp.count(n / k)) calc(n / k);
        for (int i : mp[n / k])
            mp[n].insert(i + k - 1);
    }
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    cin >> n;

    mp[1].insert(0);
    calc(n);

    cout << mp[n].size() << '\n';
    for (int i : mp[n]) cout << i << ' ';
    cout << '\n';
}
/**  /\_/\
 *  (= ._.)
 *  / >0  \>1
**/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...