이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
/**
* - 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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |