# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
464955 | idk321 | Toys (CEOI18_toy) | C++17 | 5049 ms | 88160 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
unordered_map<int, unordered_set<int>> possibleAt;
const int N = 10000000;
int divFac[N];
void getDivisors(vector<int>& divisors, vector<array<int, 2>>& freqs, int ind, int cur) {
if (ind == freqs.size()) {
divisors.push_back(cur);
return;
}
for (int i = 0; i <= (freqs[ind][1]); i++) {
getDivisors(divisors, freqs, ind + 1, cur);
cur *= freqs[ind][0];
}
}
void solveFor(int num) {
if (possibleAt.find(num) != possibleAt.end()) return;
possibleAt[num].insert(num - 1);
if (num < N) {
map<int, int> mapp;
int cnum = num;
while (cnum != 1) {
mapp[divFac[cnum]]++;
cnum /= divFac[cnum];
}
vector<int> divisors;
vector<array<int, 2>> freqs;
for (auto it = mapp.begin(); it != mapp.end(); it++) freqs.push_back({it->first, it->second});
getDivisors(divisors, freqs, 0, 1);
for (int divisor : divisors) {
if (divisor != 1 && divisor <= num / 2) {
solveFor(divisor);
solveFor(num / divisor);
for (auto it = possibleAt[divisor].begin(); it != possibleAt[divisor].end(); it++) {
for (auto it2 = possibleAt[num / divisor].begin(); it2 != possibleAt[num / divisor].end(); it2++) {
possibleAt[num].insert(*it + *it2);
}
}
}
}
} else {
int cur = 2;
while (cur * cur <= num) {
if (num % cur == 0) {
solveFor(cur);
solveFor(num / cur);
for (auto it = possibleAt[cur].begin(); it != possibleAt[cur].end(); it++) {
for (auto it2 = possibleAt[num / cur].begin(); it2 != possibleAt[num / cur].end(); it2++) {
possibleAt[num].insert(*it + *it2);
}
}
}
cur++;
}
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
for (int i = 2; i < N; i++) {
if (!divFac[i]) {
divFac[i] = i;
for (int j = i; j < N; j += i) {
divFac[j] = i;
}
}
}
int n;
cin >> n;
solveFor(n);
cout << possibleAt[n].size() << "\n";
vector<int> res(possibleAt[n].begin(), possibleAt[n].end());
sort(res.begin(), res.end());
for (int i : res) cout << i << " ";
cout << "\n";
}
Compilation message (stderr)
# | 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... |